按钮标签在XIB支持的视图中消失

Phi*_*ert 5 objective-c xib uiview nib ios

我有一个严重的问题,一个由XIB文件定义的视图.这是一个简单的数字输入板,按钮为0-9:

截图

问题是在极少数情况下(如上面的屏幕截图所示),缺少按钮标签.它并不总是相同的标签(在上面的示例中,缺少"0").通常关闭视图并重新创建它可以解决问题.

XIB文件的按钮附加到视图中的UIButton控件.视图构造如下:

@property (nonatomic,strong) IBOutlet UIButton *button0;
// etc...
@property (nonatomic,strong) IBOutlet UIButton *button9;

- (id)initWithFrame:(CGRect)frame
{
    self = [[UINib nibWithNibName:[[self class] description] bundle:nil]
                instantiateWithOwner:nil 
                options:nil
           ][0];

    if (self)
    {
        self.frame = frame;

        // ...
    }

    return self;
}
Run Code Online (Sandbox Code Playgroud)

没有涉及控制器,我也不想这样.

该视图是使用以下代码创建的:

CustomView *view = [[CustomView alloc] initWithFrame:frame];
Run Code Online (Sandbox Code Playgroud)

当问题发生时(通常不是随机的),用户点击带有缺失标签的按钮,按钮的titleLabel.text属性为nil:

- (IBAction) numberButtonPressed:(UIButton *)button
{
   NSLog("button label = %@",button.titleLabel.text);

   // output: button label = (null)
}
Run Code Online (Sandbox Code Playgroud)

XIB文件的XML:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="5056" systemVersion="13C64" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
    <dependencies>
        <deployment defaultVersion="1536" identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="3733"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view contentMode="scaleToFill" id="1" customClass="AmountEntryView">
            <rect key="frame" x="0.0" y="0.0" width="242" height="345"/>
            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
            <subviews>
                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="3" customClass="UIButton">
                    <rect key="frame" x="0.0" y="56" width="80" height="56"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <color key="backgroundColor" white="0.80112777219999998" alpha="1" colorSpace="calibratedWhite"/>
                    <fontDescription key="fontDescription" type="boldSystem" pointSize="40"/>
                    <state key="normal" title="7">
                        <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
                        <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
                    </state>
                    <connections>
                        <action selector="numberButtonPressed:" destination="1" eventType="touchUpInside" id="142"/>
                    </connections>
                </button>

                <!-- ALL OTHER BUTTONS (omitted, as they are identical) -->

                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="0.00" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="107">
                    <rect key="frame" x="0.0" y="0.0" width="242" height="56"/>
                    <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                    <color key="backgroundColor" white="0.91557459679999997" alpha="1" colorSpace="calibratedWhite"/>
                    <fontDescription key="fontDescription" type="boldSystem" pointSize="32"/>
                    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
                    <nil key="highlightedColor"/>
                </label>
            </subviews>
            <color key="backgroundColor" white="0.72580645160000001" alpha="1" colorSpace="calibratedWhite"/>
            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
            <connections>
                <outlet property="button0" destination="86" id="108"/>
                <outlet property="button1" destination="58" id="109"/>
                <outlet property="button2" destination="60" id="110"/>
                <outlet property="button3" destination="59" id="111"/>
                <outlet property="button4" destination="30" id="112"/>
                <outlet property="button5" destination="32" id="113"/>
                <outlet property="button6" destination="31" id="114"/>
                <outlet property="button7" destination="3" id="115"/>
                <outlet property="button8" destination="19" id="116"/>
                <outlet property="button9" destination="8" id="117"/>
                <outlet property="buttonBack" destination="105" id="118"/>
                <outlet property="buttonDone" destination="106" id="119"/>
                <outlet property="buttonDot" destination="94" id="120"/>
                <outlet property="labelAmount" destination="107" id="133"/>
            </connections>
        </view>
    </objects>
</document>
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会出现这个问题,我在这里或网上的任何其他地方都找不到类似的报道.

Han*_*son 2

设置标签时使用:

\n\n
[self.button0 setTitle:@"0" forState:UIControlStateNormal];\n
Run Code Online (Sandbox Code Playgroud)\n\n

不是:

\n\n
self.button0.titleLabel.text = @"0";\n
Run Code Online (Sandbox Code Playgroud)\n\n

此方法不会保留标题集,即设备旋转等后标题会消失。

\n\n

其他可能的原因:

\n\n
    \n
  • 减小 UIButton 中的字体大小。如果用户使用\n设置来使用较大的动态字体大小,则文本可能会变得\n较大而不适合。

  • \n
  • 在没有 XIB 的情况下在代码中设置 UIView。

  • \n
\n\n

边注: \n您还可以通过标签引用按钮,那么您的代码将变得更简单,因为您不必\xc2\xb4单独连接每个按钮。

\n