从超级视图中删除TableView时如何通知我?

时间:2013-09-30 23:48:40

标签: iphone ios objective-c uitableview

我已用其他几种语言编程,但这基本上是我的第一个ios应用程序,我正在努力正确实现UITableView。 阅读完文档之后,最常见的方法是创建一个类,它是UITableViewController的子类。我已经完成了这个,我已经实现了所有数据源协议方法以及委托协议中的行选择方法,并为其提供了三个属性。

第一个是tableview中的行数, 第二个是要在表视图中显示为标签的项目数组, 最后有一个属性来保存所选行的标签文本。 选择行后,我设置了包含此标签的属性,然后使用[self.view removeFromSuperView]从视图中删除表格。

以上不是我应用中的唯一视图。该应用程序是一个颜色选择器,从学校,所以主视图包含操纵显示颜色的所有控件。

在对UITableViewController进行子类化之后我做了什么,在我的主视图控制器中创建了这个子类的实例,并使其成为一个属性。因此,在主视图上是一个调用按钮,允许用户从以前保存的颜色列表中进行选择。单击此按钮时,将调用此IBAction方法

-(IBAction)swithToSavedColorsView:(id)sender {
self.savedColorTable.numberOfRows = self.dictionaryOfSavedColors.count;
NSLog( @"Count in switch view is %d", self.dictionaryOfSavedColors.count );
[ self.view addSubview:self.savedColorTable.view ];

}

这将显示可用保存颜色的列表,并使用

响应行选择
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:
(NSIndexPath *)indexPath {
self.textFromColorSelection = [ [ NSString alloc ] init ];
UITableViewCell *cell = [ tableView cellForRowAtIndexPath:indexPath ];
self.textFromColorSelection = cell.textLabel.text;
NSLog(@"The value of selection is %@ ", self.textFromColorSelection );
[ self.view removeFromSuperview ]; // Go back to main screen.

}

当我编写这段代码时,我感到非常感觉我从一开始就以完全错误的方式创建了UITableView。如果我在设置这些对象之间进行通信,请告诉我是否做错了。

我实际上试图解决的问题是在我打电话后的上述方法中 [ self.view removeFromSuperView ],我的其他观点如何知道何时发生这种情况?当UITableView关闭时我想要做的是让我的另一个视图从我创建的实例中获取label属性,并使用该标签从数据库中检索信息。

感谢您的帮助,非常感谢。

2 个答案:

答案 0 :(得分:0)

在您的子类UITableViewController中,应在删除视图后调用viewWillDisappearviewDidDisappear。尝试在视图消失时发送通知(查看NSNotificationCenter)。

答案 1 :(得分:0)

如果您需要多个控制器来响应解雇表,您可能希望在viewWillDisappear或viewDidDisappear中使用NSNotificationCenter。您更有可能从viewController呈现,并且只有viewController正在等待学习选择的颜色。我建议使用委托/协议模式处理它。

将这样的内容添加到@interface行上方的颜色选择表myColorPickTableController.h文件中:

@class myColorPickTableController;
@protocol myColorPickTableControllerDelegate
-(void)myColorPickTableControllerDidSelectColor:(UIColor *)selectedColor sender:(myColorPickTableController *)sender;
@end

在该标题中添加一个属性,以存储对委托的引用(等待听到所选颜色的控制器)。

@property(nonatomic, unsafe_unretained)id<myColorPickTableControllerDelegate> delegate;

现在,替换

[ self.view removeFromSuperview ]; // Go back to main screen.

[delegate myColorPickTableControllerDidSelectColor:[UIColor whateverColorWasPicked] sender:self]; // Tell main screen user picked a color

现在在呈现控制器中,您需要通过添加到接口行来符合协议

@interface myPresentingController : UIWhateverControllerIAm <myColorPickTableDelegate> // Add that part between <>

现在,在myPresentingController.m中实现方法

-(void)myColorPickTableControllerDidSelectColor:(UIColor *)selectedColor sender:(myColorPickTableController *)sender
{
  [self saveTheSelectedColor:selectedColor];
  [sender.view removeFromSuperview]; // I am not so sure about that, should be presenting, maybe modally or use navigation controller. Should work thought, not my first choice.
  sender = nil; // Just for good measure
}

最后,请记住在创建时使您的呈现控制器成为myColorPickTableController的委托。将委托设置为自我,如此

myColorPickTableController *pickTable = [myColorPickTableController alloc] init];
pickTable.delegate = self.