0

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

第一个是 tableview 中的行数,第二个是要在 table view 中显示为标签的项目数组,最后有一个属性来保存所选行中标签的文本。选择该行后,我设置保存此标签的属性,然后使用[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 关闭时,我想做的是让我的另一个视图从我创建的实例中获取标签属性,并使用该标签从数据库中检索信息。

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

4

2 回答 2

0

在您的 subclassed中UITableViewController,应该在您的视图被删除后调用。尝试在您的视图消失时发送通知(查看)。 viewWillDisappearviewDidDisappearNSNotificationCenter

于 2013-10-01T00:22:34.050 回答
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.
于 2013-10-01T17:25:30.110 回答