0

好的,这就是我的情况。

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

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

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

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

4

2 回答 2

1

委派是通往这里的道路。这个设置虽然有点令人困惑,可能是为什么那里的资源不完全符合您的要求。

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

细胞数据

@protocol JDPlotCellDelegate <NSObject>

- (void)didFinishEditingWithData:(id)someData;

@end

现在,当UITextField发送它的 didFinishEditing 委托消息时:

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

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

到目前为止很简单吧?

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

主视图控制器

- (void)didFinishEditingWithData:(id)someData {

    [self.detailViewController plotSomeData:someData];
}

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

希望这可以帮助!

于 2013-04-06T18:49:54.233 回答
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);
}

在 listener 类的 dealloc 中删除通知观察者

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

现在一切都设置好了,我们必须触发事件,在主类中的任意位置添加以下行(根据您的情况,可能在 textField 委托方法中):

[[NSNotificationCenter defaultCenter] postNotificationName:@"MasterEventNotfication" object:yourTextField.text];
于 2013-04-06T18:58:03.840 回答