1

我有一个关于 iOS(或者更准确地说是 Objective-C)和属性的问题。我有一个带有 UISegmentedControl 的 UIView,默认情况下它有 3 个段。我有一条接受参数的消息,并且基于此参数,我可能想删除其中一个段。在 UIView AI 中这样做:

MyViewController *myview = [[[MyViewController alloc] initWithNibName:@"MyViewController" nib:nil] autorelease];
[[self navigationController] pushViewController:myview animate:YES];
[myview showItem:item];

在 UIView B 中,这发生在 showItem 中:

-(void) showItem:(Item*)item{
    if (item.removeSegment){
        [segmentControl removeSegmentAtIndex:0 animate:NO];
    }
}

我注意到只有在我将它推送到导航控制器后调用 showItem 时才会删除该段。当我交换这两行时,我首先调用 showItem 然后推送视图, UISegmentedControl 仍然有三个段而不是两个段。

这只是感觉不对,如果有人没有按正确的顺序调用两条消息,我的代码就会中断,这似乎是一种不好的做法。有一个更好的方法吗?我一直在寻找某种我可以使用的属性生命周期,我对 ActionScript 3 非常熟悉,但我一直无法找到关于该主题的任何内容。

(顺便说一句:在 AS3 中我会创建一个属性,在设置器中我不操作任何屏幕控件,而是调用 InvalideProperties。一旦创建了整个对象和子控件,我的重写方法 CommitProperties 将被调用。在 CommitProperties 我检查如果我的属性值发生了变化,这就是我要删除该段的地方。)

4

2 回答 2

2

执行此类操作的一种常见方法是在其中创建一个Item *item属性MyViewController并设置它myview的创建时间。因此,您的代码变为:

MyViewController *myview = [[[MyViewController alloc] initWithNibName:@"MyViewController" nib:nil] autorelease];
myview.item = item;
[[self navigationController] pushViewController:myview animate:YES];

MyViewController然后将在其方法中使用该属性viewWillAppear:来配置其自己的段控件。

于 2012-06-21T14:14:57.793 回答
0

我认为由于视图的延迟加载,myview->segmentControl 在引用 myview.view 之前不存在。

-(void) showItem:(Item*)item{
    [self view]; // NO OP TO FORCE LOAD!!
    if (item.removeSegment){
        [segmentControl removeSegmentAtIndex:0 animate:NO];
    }
}

应该为你工作。希望这可以帮助!

于 2012-06-21T15:24:41.997 回答