将UITableView行从一个tableviewController发送到另一个

时间:2013-07-15 13:45:16

标签: ios uitableview

我想在UITableViewCell从一个控制器向另一个控制器发送indexPath.row。我可以使用removeObjectAtIndex删除行,但无法将删除的行发送到另一个控制器。

我正在尝试将删除的行存储在一个控制器中的NSMutableArray中,但不知道如何在另一个控制器中填充它。

以下是代码 -

ViewController *view= [self.storyboard        instantiateViewControllerWithIdentifier:@"ViewController"];
   view.anotherviewArray= [self.arrayFromAFNetworking objectAtIndex:indexPath.row];

如果有人能给我一个想法,那将会很有帮助。

3 个答案:

答案 0 :(得分:2)

我认为保留UI元素并将其传递给您的应用是不好的做法。您应该使用某种包含数据的模型,并将此模型从一个视图控制器传递到另一个视图控制器。我建议查看tableview框架,例如免费的Sensible TableView框架,因为它们可以自动为您提供这样的模型。

答案 1 :(得分:1)

我个人认为将UI对象作为参数传递给另一个控制器是错误的方法。 正如我所做的那样,创建一些对象来封装来自此单元的数据模型,并将此对象传递给另一个视图控制器。

@interface DataObject : NSObject
@property id field1;
@end

单元格的UI部分可以在Interface Builder中轻松复制,所以我没有看到问题。可能有一个单元类可以用数据填充对象的必要字段会很棒。您可以在两个必须显示相同单元格的视图控制器中使用此类

@interface CustomTableViewCell : UITableViewCell
- (void)customizeCellWithDataObject:(DataObject *)dataObject;
@end

我希望你有意义

答案 2 :(得分:0)

假设您想要仅使用此行设置其他数据源,则需要将其作为数组传递。

view.anotherviewArray= [NSArray arrayWithObject:[self.arrayFromAFNetworking objectAtIndex:indexPath.row]]; 

但是从你提供的小代码中很难说出来。我假设您正在实例化viewController,您也在提供的代码下面转换到它。如果您正在尝试为已经呈现的viewController设置数组,则需要访问该数组,而不是创建另一个,可能是在当前viewController或其他可访问类中保存了对它的引用。

我也不会将ViewController命名为view,对于以后阅读代码的人来说,这会让人感到困惑。

编辑以下关于遍历层次结构的评论。以下是我在一个iPad项目中使用的一些代码,用于返回最终呈现的viewController。此方法位于appDelegate中。它有些特定于我的项目,其中只有一个navigationController。但你可以适应你的。您将测试一个viewController,它是目标视图控制器的类。

- (UIViewController *)topViewController {
  UIViewController *rootViewController = self.window.rootViewController;
  UIViewController *topViewController = rootViewController.presentedViewController;

  while (topViewController && topViewController.presentedViewController) {
      topViewController = topViewController.presentedViewController;
      if ([topViewController isKindOfClass:[UINavigationController class]]) {
          UIViewController *presentedViewController = [(UINavigationController *) topViewController topViewController];
          if (presentedViewController) {
              topViewController = presentedViewController;
          }
      }
  }
  return topViewController;
}

另一种方法是在创建和呈现属性时为其设置属性。我们没有足够的代码来整体了解您的应用。您在哪里创建要显示的ViewController实例?我的意思是你在调用它的segue,或者将它推送到navigationController或调用presentViewController。无论在哪里,您都需要为其设置属性或ivar。假设您在appDelegate中使用属性作为一种非常通用的情况。

在您的MyAppDelegate.h文件中

@property(nonatomic,strong) ViewController *viewController;

无论您何时首次创建它,都要设置该属性

MyAppDelegate *appDelegate = (MyAppDelegate*)[[UIApplication sharedApplication] delegate];
appDelegate.viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"];

我现在认为你正在尝试将其添加到另一个ViewController中的mutableArray中。然后从上面的tableViewCell替换您将使用的代码     MyAppDelegate appDelegate =(MyAppDelegate )[[UIApplication sharedApplication] delegate];     [appDelegate.viewController.mutableDataArray addObject:self.arrayFromAFNetworking objectAtIndex:indexPath.row];     [appDelegate.viewController.tableView reloadData];

我会说使用appDelegate作为属性并不是一个好习惯。但这是一个通用的答案,可行。最好将它放在viewControllers中常用的类中,以便在它们之间传递数据。也许是拥有这两个viewControllers的单个父级?