【问题标题】:How to go to the next cell (Detail View) in a UITableView?如何转到 UITableView 中的下一个单元格(详细信息视图)?
【发布时间】:2012-03-02 14:10:51
【问题描述】:

所以,我有一个 UITableView 分为 3 个部分。我希望能够,一旦我打开第一部分的第二行(即),向左滑动进入下一个单元格,向右滑动进入上一个单元格。

我为滑动写了代码:

SecondDetailView.m

- (void)viewDidLoad
{   
    UISwipeGestureRecognizer *swipeRecognizerLeft = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeDetectedLeft:)];
    swipeRecognizerLeft.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.view addGestureRecognizer:swipeRecognizerLeft];
    [swipeRecognizerLeft release];

    UISwipeGestureRecognizer *swipeRecognizerRight = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeDetectedRight:)];
    swipeRecognizerRight.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swipeRecognizerRight];
    [swipeRecognizerRight release];
}


- (void)swipeDetectedRight:(UIGestureRecognizer *)sender {

    NSLog(@"Right Swipe");

}

- (void)swipeDetectedLeft:(UIGestureRecognizer *)sender {
    NSLog(@"Left Swipe");
}

我该怎么做?将代码放入Detail View是否正确?

【问题讨论】:

    标签: objective-c uitableview


    【解决方案1】:

    对于您的问题,我有一个非常简单的解决方案。 您需要在 .h 文件中声明一个NSMutableArray *arr;,并在您移至详细信息页面时将您的数组分配给该数组。 而且你还需要声明一个NSString *currentPos; 变量。

    - (void)swipeDetectedRight:(UIGestureRecognizer *)sender {
    
       currentPos--;
       NSMutableDictionary *dic=[arr objectAtIndex:currentPos];
    
    
    }
    
    - (void)swipeDetectedLeft:(UIGestureRecognizer *)sender {
         currentPos++;
         NSMutableDictionary *dic=[arr objectAtIndex:currentPos];
    }
    

    通过这种方式,您可以获得数组的下一个和上一个索引值。

    希望对您有所帮助。 希瓦姆

    【讨论】:

    • 你能帮我解决这个问题吗:link我是一个初学者,在这个问题上需要一些帮助。
    【解决方案2】:

    在我的示例中,我使用 NSString 作为将显示在详细视图控制器中的数据。随意将其更改为适合您需要的任何内容。好的,我们开始吧:

    首先在 DetailViewController 中声明一个协议,如下所示:

    @class DetailViewController;
    
    @protocol DetailViewControllerDelegate <NSObject>
    - (void)swipeToNextCell:(DetailViewController *)sender;
    - (void)swipeToPreviousCell:(DetailViewController *)sender;
    @end
    
    @interface DetailViewController : UIViewController
    @property(weak, nonatomic) id<DetailViewControllerDelegate> delegate;
    @property(copy, nonatomic) NSString *data;
    @property(weak, nonatomic) IBOutlet UILabel *label;
    @end
    

    接下来就是在DetailViewController中添加UISwipeGestureRecognizers来检查手势:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        UISwipeGestureRecognizer *leftGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDetectedLeft:)];
        leftGesture.direction = UISwipeGestureRecognizerDirectionLeft;
        [self.view addGestureRecognizer:leftGesture];
    
        UISwipeGestureRecognizer *rightGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDetectedRight:)];
        rightGesture.direction = UISwipeGestureRecognizerDirectionRight;
        [self.view addGestureRecognizer:rightGesture];
    }
    

    实现 viewWillAppear 以在您推送 DetailViewController 时显示您的数据:

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        self.label.text = self.data;
    }
    

    不要忘记实现将被 GestureRecognizers 调用的方法:

    - (void)swipeDetectedRight:(UISwipeGestureRecognizer *)sender
    {
        NSLog(@"Right Swipe");
        [self.delegate swipeToNextCell:self];
        self.label.text = self.data;
    }
    
    - (void)swipeDetectedLeft:(UISwipeGestureRecognizer *)sender
    {
        NSLog(@"Left Swipe");
        [self.delegate swipeToPreviousCell:self];
        self.label.text = self.data;
    }
    

    这就是您在详细视图中所需要的一切。现在转到 TableViewController。您的 TableViewController 应该实现 DetailViewControllerDelegate 协议:

    @interface CustomTableViewController : UITableViewController <DetailViewControllerDelegate>
    @property(strong, nonatomic) DetailViewController *detailViewController;
    @property(assign, nonatomic) NSInteger currentRow;
    @end
    

    这是我的 detailViewController @property 的 getter:

    - (DetailViewController *)detailViewController
    {
        if (_detailViewController == nil) 
        {
            _detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
            _detailViewController.delegate = self;
        }
        return _detailViewController;
    }
    

    这是我管理行选择的方式:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        DetailViewController *viewController = self.detailViewController;
        viewController.data = [NSString stringWithFormat:@"Cell: %d", indexPath.row];
        viewController.title = @"Detail";
        self.currentRow = indexPath.row;
        [self.navigationController pushViewController:viewController animated:YES];
    }
    

    你要做的最后一件事是实现协议的方法:

    - (void)swipeToNextCell:(DetailViewController *)sender
    {
        // Get data for next row
        sender.data = [NSString stringWithFormat:@"Cell: %d", ++self.currentRow];
    
    }
    
    - (void)swipeToPreviousCell:(DetailViewController *)sender
    {
        // Get data for next row
        sender.data = [NSString stringWithFormat:@"Cell: %d", --self.currentRow];
    }
    

    我在模拟器上测试过,效果很好。这非常简单,因为我的数据模型非常简单——它只是 NSString。没有检查部分中是否有任何行,因此您必须自己弄清楚。但是整个委托模式应该是一样的。

    祝你好运!

    【讨论】:

    • 非常感谢您的回答!但是,当我拥有的不仅仅是一个 DetailViewController 时,我是否应该每次在 TableViewController 中为每个 DetailView 插入委托?
    • 我不确定你的意思。在我的代码中只有一个 DetailViewController 实例,我重用这个实例来为每个单元格显示不同的数据。您只设置一次委托 - 当您创建 detailViewController 时。这是你的意思吗?
    • 是的。简而言之,我有 70 个 detailViewController(分成几部分,每个 detailViewController 都有不同的名称,例如 firstViewController、appleViewController、nutViewController,但这只是一个细节)。对于我拥有的 70 个 detailViewController 中的每一个,我都必须将委托插入到 tableViewController 中,或者? Soz,我是新手!
    • 您真的需要 70 个控制器来显示每一行的详细信息吗?如果所有这些控制器都具有相似的视图,那么您应该考虑将它们合并到单个控制器中。无论如何,您应该为 TableViewController 中的每个控制器设置委托。如果我的回答对您有帮助,请记得投票。我在这里很新:)
    • 很遗憾是的(但是这些 detailView 中有一半是本地化和 iPad 控制器,通用应用程序 ftw)。我会测试它并让你知道。谢谢!!!
    【解决方案3】:

    在详细视图控制器中声明一个协议并将父级(应该是表视图控制器)设置为委托。然后,在 swipe 方法中调用委托并实现更改所选行所需的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多