0

NSMutableArraydetailsDataSource和 intdetailIndex从以下位置传递到下一个 View Controller MainDetailViewController.m

#import "UsersDetailViewController.h"
...
- (void)swipeDetectedUp:(UISwipeGestureRecognizer *)sender
{
    UsersDetailViewController *usersController = [[self storyboard] instantiateViewControllerWithIdentifier:@"UsersController"];
    [self.navigationController pushViewController:usersController animated:NO];

    usersController.usersDataSource = [[NSMutableArray alloc] initWithArray:detailsDataSource];
    usersController.userDetailIndex = detailIndex;
}

在索引中滑动UserDetailViewController.m

- (void)swipeDetectedRight:(UISwipeGestureRecognizer *)sender
{
if (userDetailIndex != 0)
    userDetailIndex--;  
}

当 swipeDetectedDown 弹回时,MainDataViewController需要知道要显示哪个索引处的对象:

- (void)swipeDetectedDown:(UISwipeGestureRecognizer *)sender
{
//jump to correct object at index, same as current object at index in this view
[self.navigationController popViewControllerAnimated:NO];
}

代码建议?

4

2 回答 2

0

简单的部分是将 UsersDetailViewController 指针放入 MainDetailViewController 的属性中,以便稍后可以访问 self.usersController.usersDataSource 和 self.usersController.userDetailIndex。然后唯一的技巧是让它知道何时弹出 UsersDetailViewController。

在我以前编写的代码中,我经常尝试将 MainDetailViewController 设置为 UsersDetailViewController 的委托,并在 UsersDetailViewController 想要以编程方式关闭时调用 MainDetailViewController 中的委托方法,并同时执行 popViewControllerAnimated: 并更新 MainDetailViewController 的状态. 换句话说,总是让父母的代码弹出孩子。这是可行的,但在您通过导航控制器的后退按钮自动弹出子视图控制器的情况下则不行,所以总的来说我反对这种技术。

我认为有更好的解决方案可以让父母的代码在其孩子被弹出时被调用。也许实现一个 viewWillAppear 方法,如果 self.usersController 在那里设置,那么你知道你是从 UsersDetailViewController 回来的,此时访问另一个控制器的属性并最终清除 self.usersController。

于 2012-08-28T22:14:50.127 回答
0

使用 NSNotificationCenter 将对象发送回 MainDataViewController...

例子:

在 UsersDetailViewController 中,使用 key=>value 对填充 NSDictionary,然后将其发送到您希望它去的地方。

NSArray *key = [NSArray arrayWithObject:@"myIndex"];
NSArray *object = [NSArray arrayWithObject:detailIndex];  
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:object forKeys:key];
[[NSNotificationCenter defaultCenter] postNotificationName:@"MainDataViewController" object:self userInfo:dictionary];

注意:您需要在 MainDataViewController 上设置一个标识符,称为 MainDataViewController 或您想调用的任何名称。使用 VC 名称使其更简单。

然后在 MainDataViewController 的 viewDidLoad() 方法中执行此操作。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveNotification:) name:@"MainDataViewController" object:nil];

然后使用以下方法接收通知:

- (void)receiveNotification:(NSNotification *) notification
{    
    if([[notification name] isEqualToString:@"MainDataViewController"])
    {       
        NSDictionary *dictionary = [NSDictionary dictionaryWithDictionary:[notification userInfo]];

        if([dictionary valueForKey:@"myIndex"]) 
        {
            // do whatever you need to do with the passed object here. In your case grab the detailIndex and use it for something...
        }             
    }
}
于 2012-08-28T18:56:11.047 回答