仍然是iOS开发人员的新手(在asp.net / web中有背景),我不认为我已经完全了解一切如何与其他一切相关。例如,我正在构建一个以NavigationController开头的应用程序。我正在快速地将ViewControllers传入和传出,一切正常,但现在我需要向导航控制器添加一个右键。我在其中一个ViewControllers中完成了这个:
- (void)viewDidLoad
{
UIBarButtonItem *change = [[UIBarButtonItem alloc] initWithTitle:@"CHANGE" style:UIBarButtonItemStylePlain target:self action:@selector(navAlert)];
self.navigationItem.rightBarButtonItem = change;
[change release];
[super viewDidLoad];
}
- (void)navAlert
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"nav pressed" message:@"You pressed the Change button" delegate:nil cancelButtonTitle:@"Yep" otherButtonTitles:nil];
[alert show];
[alert release];
}
但是我不想在每个控制器中都这样做 - 如果像这样的东西进入AppDelegate并从那里调用吗?
另外,假设我不想从NavigationController开始 - 我可以使用AppDelegate中的代码来释放ViewControllers并通过单击在ViewController中设置的按钮将新的直接加载到Window中吗?
很抱歉,如果这是一个有点愚蠢的问题,但我不认为我已经完全掌握了不同层的关系,哪些代码可用于哪个控制器等。
由于
答案 0 :(得分:4)
你应该不将与界面相关的代码放在appdelegate中。这就是ViewControllers的用途。如果你的viewcontrollers的所有共有的功能,我建议继承UIViewController(然后从这个子类派生所有其他实例)或在其上写一个类别。
另一方面,appdelegate是触发与应用程序生命周期相关的基本事件的好地方,例如设置核心数据上下文或在即将进入后台时保存应用程序状态。
答案 1 :(得分:1)
如果您在viewDidLoad
中尝试执行的操作在UINavigationController
中有正确的“后退”按钮,则无需这样做。只需将控制器的title
属性定义为您喜欢的属性即可。控制器的init
方法可以做到这一点(在这种情况下viewDidLoad
不需要:
self.title = @"CHANGE";
或者你可以在appDelegate中设置它:
controller.title = @"CHANGE";
至于你的另一个问题,最好的事情是从头开始使用基于视图或基于窗口的项目模板。
否则,你是对的:你可以从appDelegate发布你不需要的预定义控制器并创建你自己的控制器。此外,您应该注意从父级删除所有控制器的视图:
[controller.view removeFromSuperview];
(对于您删除的每个控制器以及您委派的[self.window addSubview]
,可能只是UiNavigationController
)。
无论如何,我不知道我是否可以建议这条路径,因为你还需要修复与xib文件相关的所有依赖项,并且会给你带来一些麻烦。