1

我正在我的 viewDidLoad 方法中构建一个分段控件,如下所示:

NSArray *tabitems = [NSArray arrayWithObjects:@"ONE", @"TWO", nil];
UISegmentedControl *tabs = [[UISegmentedControl alloc] initWithItems:tabitems];
tabs.segmentedControlStyle = UISegmentedControlStyleBar;
tabs.frame = CGRectMake(185.0, 7.0, 130.0, 30.0);
tabs.selectedSegmentIndex = 0;
[self.navigationController.navigationBar addSubview:tabs];
[tabs release];

但是当用户返回 uinavigationcontroller 层次结构时,分段控制器会停留在导航栏上。我将如何摆脱它?还是我做错了什么?


编辑

按照亚历克斯的建议,我对标签进行了属性化并尝试了:

  NSArray *tabItems = [NSArray arrayWithObjects:@"FAQs", @"Terms", nil];
  self.tabs = [[UISegmentedControl alloc] initWithItems:tabItems];

但我不确定分配属性是否是个好主意;

我正在使用

  [self.tabs removeFromSuperview];

在我看来将消失。够了吗?

4

2 回答 2

2

在视图控制器中保留对分段控件的引用(即定义tabs为视图控制器头文件中的属性)。

覆盖视图控制器的-viewWillDisappear:方法,并使用控件的-removeFromSuperview方法从导航栏中删除分段控件。

编辑

alloc-init您仍然会tabs-viewDidLoad. tabs您只需要在视图控制器的标题中设置一个保留属性,并将控件的release语句移动到视图控制器的dealloc方法。

阅读此Objective-C 教程的“属性”部分,了解属性的介绍以及如何设置它们。

重写方法的方法如下:

- (ReturnClass) methodNameToOverride:args {
    [super methodNameToOverride:args];
    // your code goes here...
}

在 的情况下-viewWillDisappear:,当您的视图控制器即将消失时调用此方法,例如当它从导航堆栈中弹出时。这是放置管理视图控制器特定项目清理的代码的好地方,例如您的分段控件:

- (void) viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [tabs removeFromSuperview];
}

编辑 2

如果您的属性设置如下:

@property (nonatomic, retain) UISegmentedControl *tabs;

然后你会去retain任何你设置self.tabs等于的东西。

你的代码在这里:

self.tabs = [[UISegmentedControl alloc] initWithItems:...];

会造成内存泄漏,因为你保留了这个对象:[[UISegmentedControl alloc] init]——但你永远不会释放[[UISegmentedControl alloc] init]自己。这是不好的。

相反,autorelease在右侧使用,即:

self.tabs = [[[UISegmentedControl alloc] initWithItems:...] autorelease];

tabs属性保留自己对已初始化分段控件的引用。初始化的分段控制本身会在稍后的某个时间点正确释放。所以没有更多的内存泄漏。

于 2010-05-18T09:56:29.097 回答
0

更好的是,将 UISegmentedControl 的所属 UIViewController 的 navigationItem.titleView 设置为 UISegmentedControl。

-(void) viewDidLoad {
    if(!mySegmentedControl) {
        // initialize the UISegmentedControl
        ...
    }

    self.navigationItem.titleView = mySegmentedControl; 
}

不需要手动删除 UISegmentedControl 或任何其他 UIView ,当然,除非在释放拥有 UIViewController 时释放。此外,要成为“好记性的公民”,您可以将您的属性设置为 nil in -viewDidUnload

也可以自定义 UIViewController 的 navgiationItem 的左右 barButtonItems。

于 2010-11-23T18:05:47.440 回答