没有 JKSegueActionViewController,您将不得不编写类似下面的代码
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifer isEqualToString:@"MySegue1"]) {
MyCustomViewController *vc = segue.destinationViewController;
vc.delegate = self;
} else if ([segue.identifer isEqualToString:@"MySegue2"]) {
MyOtherCustomViewController *vc = segue.destinationViewController;
vc.someProperty = [self computeSomeValue];
} else if ([segue.identifer isEqualToString:@"MySegue3"]) {
MyCustomTableViewController *vc = segue.destinationViewController;
vc.delegate = self;
vc.dataSource = [self dataSourceForObject:someObject];
}
}
JKSegueActionViewController 是为那些认为 \[UIViewController prepareForSegue)sender:\] 是代码组织的糟糕工具的开发者准备的。JKSegueActionViewController 提供了一种更清晰的设计,可用于编写更清晰、更容易理解的代码。
首先,使用界面构建器设置 segue 的标识符为您的准备代码的方法。
然后实现一个具有与 segue 标识符中使用相同签名的代码
-(void) segueToMySceneAction:(UIStoryboardSegue *)segue sender:(id)sender {
// Prepare the destination view controller
MyOtherCustomViewController *vc = segue.destinationViewController;
vc.someProperty = [self computeSomeValue];
}
当(seg)触发时,JKSegueActionViewController 会自动调用您的方法。
JKSegueActionViewController 给 UIViewController 添加了一个使用一个用于准备代码的块来手动执行 seg 的方法。它允许您编写代码,以使您的执行和准备代码放在一起,以便更容易查找、阅读和理解。
[self performSegueWithIdentifier:@"MySegue1" sender:self withBlock:^(UIStoryboardSegue *segue, id sender) {
// Prepare the destination view controller
MyCustomViewController *vc = segue.destinationViewController;
vc.delegate = self;
}];
编写一个 segue 动作方法,并为 segue 赋予一个方法名作为其标识符。JKSegueActionViewController 将自动调用您的操作。
-(void) segueToMySceneAction:(UIStoryboardSegue *)segue sender:(id)sender {
// Prepare the destination view controller
MyOtherCustomViewController *vc = segue.destinationViewController;
vc.someProperty = [self computeSomeValue];
}
类似于上面的命名 segue 动作,但省略 sender 参数。
-(void) segueToMySceneAction:(UIStoryboardSegue *)segue {
// Prepare the destination view controller
MyOtherCustomViewController *vc = segue.destinationViewController;
vc.someProperty = [self computeSomeValue];
}
手动执行 segue 时,请使用此方法而不是传统的 performSegueWithIdentifier)sender。传递一个要为您的 segue 准备的块。
[self performSegueWithIdentifier:@"MySegue2" sender:self withBlock:^(UIStoryboardSegue *segue, id sender) {
// Prepare the destination view controller
MyCustomViewController *vc = segue.destinationViewController;
vc.delegate = self;
}];
当你有一个将手动执行的 segue 时,你可以使用此方法设置一个在每次执行 segue 时使用的块。
- (void) viewDidLoad {
[super viewDidLoad]
[self setActionForSegueWithIdentifier:@"MySegue3" toBlock:^(id theSender) {
// Prepare the destination view controller
MyCustomTableViewController *vc = segue.destinationViewController;
vc.delegate = self;
vc.dataSource = [self dataSourceForObject:someObject];
}];
}
- (void) someOtherMethod {
// This will perform the segue and then invoke the action block registered in -viewDidLoad
[self performSegueWithIdentifier:@"MySegue3" sender:self];
}
如果您发现您想或需要使用传统的 prepareForSegue:sender:,您依然可以使用。只需实现您自己的准备ForSegue:sender:的一个副本,保留所有字符串匹配的荣耀。但是请务必调用[super prepareForSegue:sender:],否则您会破坏JKSegueActionViewController的逻辑。