3

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

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

下面是代码 -

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

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

4

3 回答 3

2

我认为保留 UI 元素并将它们传递给您的应用程序是不好的做法。相反,您应该拥有某种包含数据的模型,并将此模型从一个视图控制器传递到另一个视图控制器。我建议查看免费的 Sensible TableView 框架等 tableview 框架,因为它们在自动为您提供这样的模型方面做得非常出色。

于 2013-07-15T19:17:59.403 回答
1

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

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

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

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

我希望这对你有意义

于 2013-07-15T13:52:27.327 回答
0

假设您确实希望仅使用这一行设置其他数据源,则需要将其作为数组传递。

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

但是从您提供的小代码中很难分辨。我假设由于您正在实例化 viewController,因此您也在提供的代码下方过渡到它。如果您尝试为已呈现的 viewController 设置数组,则需要访问该数组,而不是创建另一个数组,可能通过在当前 viewController 或另一个可访问类中保存对它的 ivar 的引用。

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

编辑下面关于遍历层次结构的评论。这是我在一个 iPad 项目中用于返回最终呈现的 viewController 的一些代码。此方法在 appDelegate 中。它有点特定于我的项目,其中只有一个导航控制器。但是你可以让它适应你的。您将测试属于您的目标视图控制器类的 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 用于属性并不是一个好习惯。但这是一个可行的通用答案。最好将它放在一个类中,该类对于您在其间传递数据的 viewController 是通用的。也许拥有这两个视图控制器的单亲?

于 2013-07-15T14:05:44.690 回答