你不能那样做。您需要设置委托协议。见This tutorial
并搜索“新代表”一词,它将解释如何完成。这就是您需要使用的设计模式。涉及多个步骤,因此请密切关注。值得学习。委托协议在 iPhone 应用程序中很常见。
在当前项目中,我创建了一个委托协议来在两个控制器之间进行通信:SelectNoteViewController (Select) 和 EditNoteViewController (Edit)。基本思想是 Select 用于从笔记列表中进行选择,而 Edit 用于编辑这些笔记。现在,我需要 Edit 才能访问 Select 保存的数据和方法,因为我在编辑中有按钮可以从 Select 管理的列表中调用上一个或下一个注释,因此我实现了一个委托协议。 Select 是 Edit 的代表。这意味着 Select 为 Edit 做事。这是基本代码。
SelectNoteViewController.h:
// this next statement is need to inform Select of the protocols defined in Edit
#import "EditNoteViewController.h" // STEP 1
@interface SelectNoteViewController : UITableViewController <EditNoteViewControllerDelegate> { ... // STEP 2: this says Select implements the protocol I created
...
// STEP 3: EditNoteViewController Delegate Methods - these are the methods in the protocol
- (Notes *)selectPreviousNote;
- (Notes *)selectNextNote;
SelectNoteViewController.m:
// STEP 4: the protocol methods are implemented
- (Notes *)selectPreviousNote {
if (isPreviousToSelectedNote) {
NSIndexPath *indexPath, *previousIndexPath;
indexPath = [self.tableView indexPathForSelectedRow];
previousIndexPath = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:0];
// update the selected row
self.selectedNote = [self.fetchedResultsController objectAtIndexPath:previousIndexPath];
[self.tableView selectRowAtIndexPath:previousIndexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];
[self setPreviousNote];
[self setNextNote];
}
return selectedNote;
}
- (Notes *)selectNextNote {
if (isNextToSelectedNote) {
NSIndexPath *indexPath, *nextIndexPath;
indexPath = [self.tableView indexPathForSelectedRow];
nextIndexPath = [NSIndexPath indexPathForRow:indexPath.row-1 inSection:0];
// update the selected row
self.selectedNote = [self.fetchedResultsController objectAtIndexPath:nextIndexPath];
[self.tableView selectRowAtIndexPath:nextIndexPath animated:NO scrollPosition:UITableViewScrollPositionMiddle];
[self setPreviousNote];
[self setNextNote];
}
return selectedNote;
}
...
...
if ([[segue identifier] isEqualToString:@"editNote"]) {
// STEP 5: this is where Edit is told that its delegate is Select
[[segue destinationViewController] setEditNoteViewControllerDelegate:self]; // STEP 5
Select 现在具有作为 Edit 代表的结构。现在 Edit 需要在其末端定义协议,它将用于访问 Select 中的那些方法。
EditNoteViewController.h
#import ... // put protocol after import statements
// STEP 6
@protocol EditNoteViewControllerDelegate <NSObject>
- (Notes *)selectPreviousNote;
- (Notes *)selectNextNote;
@end
@interface ...
// STEP7: Edit needs a property to tell it who the delegate is - it was set back in Select.m
@property (weak) id <EditNoteViewControllerDelegate> editNoteViewControllerDelegate;
EditNoteViewController.m
// STEP 8: the property is synthesized
@synthesize editNoteViewControllerDelegate;
...
// STEP 9: now when any method needs to call selectPreviousNote or selectNext Note it does it like this:
selectedNote = [self.editNoteViewControllerDelegate selectPreviousNote];
// or
selectedNote = [self.editNoteViewControllerDelegate selectNextNote];
就是这样。当然,协议方法和其他方法一样,它们可以传递参数,你需要做什么才能将数据传回,这首先是你的问题。附带说明一下,通过在 Edit 中创建属性并在 Select 的 prepareForSegue 方法中设置这些属性,我可以在没有协议的情况下将数据从 Select 传递到 Edit。这样做可以让我在实例化 Edit 时设置一些参数。我对委托协议的使用返回到 Select 并将另一个注释(上一个或下一个)传递给 Edit。我希望这会有所帮助。您可以看到创建委托协议有几个步骤。我将它们编号为 1-9。如果数据没有返回,我通常会发现我忘记了其中一个步骤。