2012-02-20 31 views
4

所以,我有一個UITableView拆分3節。我希望能夠,一旦我打開第一部分中的第二行(即),向左滑動到下一個單元格,並向右滑動到前一個單元格。如何轉到UITableView中的下一個單元格(細節視圖)?

我寫的刷卡代碼:

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中是否正確?

回答

3

我有一個非常簡單的解決方案,爲您的問題。 您需要在.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]; 
} 

以這種方式,你可以得到你的下一個和prev索引值的數組。

希望爲您提供幫助。 Shivam

+0

你能幫我在這個問題:[鏈接](http://stackoverflow.com/questions/11513706/access-uitableview-cell-and-swipe-between-them-from-detailview-using-xcode-4)我是初學者,需要一些關於這個主題的幫助。 – ingenspor 2012-07-17 10:21:21

0

在詳細視圖控制器中聲明一個協議,並將父級(應該是表視圖控制器)設置爲委託。然後,在滑動方法中調用委託並實現更改所選行所需的代碼。

1

在我的例子中,我使用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吸氣:

- (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。沒有檢查部分是否有任何行,所以你必須自己弄清楚。但整個代表團模式應該是一樣的。

祝你好運!

+0

非常感謝您的回答!但是,當我有更多的不只是一個DetailViewController,我應該插入每次在我的TableViewController的每個DetailView的委託? – Phillip 2012-02-29 14:13:07

+0

我不確定你的意思。在我的代碼中,只有一個DetailViewController實例,我重複使用這個實例爲每個單元格顯示不同的數據。您只需設置一次委派 - 當您創建detailViewController時。這是你的意思嗎? – nagan 2012-02-29 17:52:01

+0

是的。換句話說,我有70個detailViewControllers(分段,每個detailViewController具有不同的名稱,如firstViewController,appleViewController,nutViewController,但這只是一個細節)。我必須將委託插入tableViewController爲每個70個detailViewControllers,我有或? Soz,我是新手! – Phillip 2012-02-29 18:51:20

相關問題