在类ios之间发送数据?

时间:2013-04-06 18:30:07

标签: ios objective-c ios6

好的,这就是我的情况。

我使用主详细信息模板创建了新项目,在MasterViewController中我有表格和单元格,只显示标题。我将单元格修改为自定义并添加了两个文本字段。我的应用程序要求是在用户在文本字段中输入点时实时绘制图形。图形显示在详细视图中,该部分工作正常(图形绘图)。

现在我的问题是如何从不是uiview控制器的类传输数据。 MasterViewController是UITableViewController的子类,但要为文本字段创建出口,我必须拥有UITableViewCell的子类。所以我创建了新类CellData(UITableViewCell的子类),我可以使用IBAction实时获取文本字段的值,并为文本字段和数据自动添加IBOutlets数据。

现在我应该如何将此数组推送到MasterViewController,然后再进一步实现绘制图形的GraphDraw类。我所做的是创建全球课程,我怀疑这不是理想的解决方案。我应该像有人建议的那样创建三路协议和委托解决方案或模型类吗?

到目前为止,所有协议和委托教程都集中在viewControllers上,我没有遇到任何问题,但它们对我的情况并不适用。而作为NSObject的子类的模型类,我无法直接获取单元格数据。现在我道歉,如果问题很长,但我是初学者,我正试图找出解决这些问题的最佳方法。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

代表团是走到这里的方式。这个设置虽然有点令人困惑,但可能就是为什么那里的资源并不完全是你想要的。

首先,您需要一个可以将UITableViewCell子类的消息发送到主UITableViewController的委托。以下面的例子为例:

<强> CellData

@protocol JDPlotCellDelegate <NSObject>

- (void)didFinishEditingWithData:(id)someData;

@end

现在UITextField发送其didFinishEditing委托消息:

- (void)textFieldDidEndEditing:(UITextField *)textField {

    [self.delegate didFinishEditingWithData:textField.text];
}

到目前为止简单吗?

接下来,您的主tableview控制器需要实现委托(并确保单元格已连接委托属性!)

<强> MasterViewController

- (void)didFinishEditingWithData:(id)someData {

    [self.detailViewController plotSomeData:someData];
}

然后,由于master有一个对详细信息视图控制器的引用,它可以像在详细视图控制器上声明一个可以获取数据并绘制它的公共方法- (void)plotSomeData:(id)someData;一样简单。

希望这有帮助!

答案 1 :(得分:1)

如果您不愿意使用委托,那么我的意思是您可以使用NSNotifications告诉应用程序中的其他听众发生了某些事件,并且您还可以通过通知捎带一些数据。

在接收通知-viewDidLoad时,可以添加:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(masterEventOccurred:) name:@"MasterEventNotfication" object:nil]; 

在侦听器类中添加此函数

-(void)masterEventOccurred:(NSNotification *)notification
{
   //notification happened
   NSLog(@"object sent: %@",notification.object);
}

在侦听器类的dealloc中删除通知观察器

-(void) dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
 } 

现在一切都已设置我们必须触发事件,在主类中的任何地方添加以下行(根据您的说法,可能在textField委托方法中):

[[NSNotificationCenter defaultCenter] postNotificationName:@"MasterEventNotfication" object:yourTextField.text];