2012-05-02 37 views
7

Ban đầu tôi có chế độ xem bảng chỉ với một nút thêm.Cách thêm hàng/ô động vào UITableView bằng cách nhấn một nút trong iPhone

khi người dùng bấm vào nút này tôi cần phải tăng các tế bào đếm và thêm các tế bào như sau

Làm thế nào để viết đếm hàng và làm thế nào để thêm các hàng mới bằng cách nhấp chuột vào nút add

// Row đếm

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return **????** ; 
} 

// Nội dung trên tế bào/hàng

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     ?????? 
} 

// ### Add New Row .. ###

-(IBAction)myAction:(id)sender 
{ 
    ???????? ; 
} 

Cảm ơn trước ...

+2

Về cơ bản, bạn không thêm chúng vào chế độ xem, mà là thêm vào mô hình. Sau khi bạn làm điều đó, các tableviews reloadData phương pháp là bạn của bạn – HeikoG

Trả lời

7

Trong ứng dụng của bạn Bạn cần phải thêm giá trị cho mảng khi bạn thực hiện hành động trong btn.

Ví dụ trong chế độ xem bảng của bạn, bạn đang hiển thị NSString trong ô.textLABEL.text. Các chuỗi này nằm trong NSMutableArray.

Bây giờ khi buttonAction được gọi

trong MyAction

{ 
    NSString *newString [email protected]"NEW CELL"; 

    [tableArray addObject:newString]; 
    [tableView reloadData]; 
} 

Hãy thử logic này trong ứng dụng của bạn liên quan đến phương thức của bạn.

Tôi hy vọng logic này sẽ hữu ích cho bạn.

+0

Có điều này hoạt động hoàn hảo \ – Ranga

+2

Điều này sẽ hoạt động, Nhưng nó dẫn đến suy thoái hiệu suất. Để thêm một ô mới, việc tải lại toàn bộ UITableview là không có ý nghĩa. –

+3

đã đồng ý với Naveen. Sử dụng insertRowsAtIndexPaths thay vì – MANN

11

UITableView có tài sản để chèn hàng hoặc phần. xem Apple Doc

Có nhiều hướng dẫn về điều này. có 2 thường sử dụng để thêm/xóa hàng/phần.

insertRowsAtIndexPaths:withRowAnimation: 
deleteRowsAtIndexPaths:withRowAnimation: 

Tôi đã đăng tải câu trả lời tương tự như cách sử dụng này: Hiding the table view cells with switch ON/OFF in iPhone

+0

liên kết hướng dẫn của bạn không tải sir xin vui lòng đăng cập nhật liên kết. nó hiển thị lỗi oops. bất kỳ cách nào cảm ơn bạn rất nhiều vì phản hồi nhanh của bạn – Ranga

+0

hãy thử cách này:: http: //stackoverflow.com/questions/9339186/hiding-the-table-view-cells-with-switch-on-off-in-iphone – HelmiB

0

Bạn chỉ có thể thêm đối tượng vào mảng và tải lại chế độ xem bảng của mình khi nhấp vào nút.

[array addobject:@""]; 
[tableview reloaddata]; 
7

Tải lại chế độ xem bảng mỗi lần bạn muốn thêm hoặc xóa hàng tạo trải nghiệm kém cho người dùng ứng dụng của bạn. Mặc dù thực tế đó không phải là cách hiệu quả để thực hiện tác vụ này, nó cũng có một số tác dụng phụ tiêu cực - các hàng đã chọn không được chọn sau khi tải lại và thay đổi không hoạt ảnh.

UITableView có các phương pháp được tạo để thay đổi nội dung của chế độ xem bảng theo kiểu động.Đó là:

insertRowsAtIndexPaths:withRowAnimation: 
moveRowAtIndexPath:toIndexPath: 
deleteRowsAtIndexPaths:withRowAnimation: 

Chú ý rằng các phương pháp này cho phép bạn xác định loại hình ảnh động mà sẽ được sử dụng khi xác định hoạt động được thực hiện - bạn không thể đạt được loại hành vi khi bạn sử dụng reloadData để sửa đổi nội dung của xem bảng .

Hơn nữa, bạn thậm chí có thể kết hợp nhiều hoạt động xem bảng sử dụng phương pháp bổ sung của xem bảng (điều này là không cần thiết):

beginUpdates endUpdates

Chỉ cần quấn hoạt động bạn muốn thực hiện vào các cuộc gọi đến beginUpdatesendUpdates phương pháp và chế độ xem bảng sẽ tạo ra một hoạt ảnh cho tất cả các hoạt động đã được yêu cầu giữa các cuộc gọi beginUpdatesendUpdates để toàn bộ quá trình chuyển đổi đẹp hơn được tạo bởi một vài hoạt ảnh riêng biệt.

[self.tableView beginUpdates] 
//calls to insert/move and delete methods 
[self.tableView endUpdates] 

Điều quan trọng là giữ cho trạng thái nguồn dữ liệu nhất quán với trạng thái nguồn được giữ bởi UITableView. Vì lý do này, bạn phải đảm bảo rằng khi xem bảng bắt đầu thực hiện các hoạt động được yêu cầu thì nguồn dữ liệu của nó sẽ trả về các giá trị chính xác.

[self.tableView beginUpdates] 
//calls to insert/move and delete methods 
//operations on our data source so that its 
//state is consistent with state of the table view 
[self.tableView endUpdates] 

Khi chế độ xem bảng bắt đầu hoạt động? Điều này phụ thuộc vào việc các hoạt động có đang ở trong khối hoạt ảnh được xác định bởi các phương thức beginUpdatesendUpdates hay không. Nếu có, chế độ xem bảng bắt đầu thực hiện các hoạt động sau khi gọi số endUpdates. Mặt khác, chế độ xem bảng thực hiện các thao tác ngay sau khi thực hiện cuộc gọi để chèn/di chuyển hoặc xóa phương thức.

Khi bạn đang sử dụng các phương thức beginUpdatesendUpdates để thực hiện các thao tác trên bảng, bạn phải biết rằng trong trường hợp này, bảng được yêu cầu hoạt động và thực hiện theo thứ tự cụ thể. bạn đã thực hiện trên đối tượng xem bảng của bạn (Apple's documentation on this topic).

Điều quan trọng nhất cần nhớ là việc xóa tất cả các thao tác luôn được thực hiện trước tất cả các thao tác chèn. Ngoài ra, các thao tác xóa dường như được thực hiện theo thứ tự giảm dần (các thao tác cho các chỉ mục 3, 2, 1) khi thao tác chèn được thực hiện theo thứ tự tăng dần (các phép toán cho các chỉ mục 1, 2, 3). Hãy nhớ về điều này là quan trọng trong việc duy trì trạng thái nguồn dữ liệu của bạn nhất quán với nguồn dữ liệu được giữ bởi chế độ xem bảng.

Hãy dành một chút thời gian để phân tích thứ tự các hoạt động trên nguồn dữ liệu và chế độ xem bảng được trình bày trong ví dụ bên dưới.

dụ cuối cùng:

//initial state of the data source 
self.numbers = [@[@(0), @(1), @(2), @(3), @(4), @(5), @(6)] mutableCopy]; 
// 
//... 
// 

NSArray indexPathsToRemove = @[[NSIndexPath indexPathForRow:3 section:0]. 
           [NSIndexPath indexPathForRow:0 section:0]; 
NSArray indexPathsToAdd = @[[NSIndexPath indexPathForRow:6 section:0], 
          [NSIndexPath indexPathForRow:5 section:0]]; 

[self.tableView beginUpdates]; 

[self.numbers removeObjectAtIndex:3]; 
[self.numbers removeObjectAtIndex:0]; 

[self.numbers insertObject:@(10) atIndex:4]; 
[self.numbers insertObject:@(11) atIndex:5]; 

[self.tableView insertRowsAtIndexPaths:indexPathsToAdd withRowAnimation:UITableViewRowAnimationAutomatic]; 
[self.tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; 

[self.tableView endUpdates]; 
//final state of the data source ('numbers') - 1, 2, 4, 5, 6, 10, 11 
2

Có đáp án đúng khác ở đây (mà bạn nên đọc vì họ đi sâu hơn), nhưng tôi gặp khó khăn trong hơn một tuần với điều này sau khi đọc tất cả các giải pháp tôi có thể tìm thấy bởi vì không có bất kỳ (mà tôi tìm thấy!) với các ví dụ toàn diện.

Quy tắc này hoạt động: 1. Các thay đổi phải được thực hiện trực tiếp vào mảng chứa các mục bạn đang hiển thị trong UITableView.Nếu bạn đặt một số giá trị trong một UITableViewCell trong phương pháp tableView:cellForRowAtIndexPath: thành các giá trị bằng nhau trong self.expandableArray, thì các thay đổi phải cũng được thực hiện thành self.expandableArray để các phương thức này hoạt động.

  1. thay đổi đối với mảng các hạng mục được hiển thị trong tableView phải được thực hiện ở giữa[tableView beginUpdates][tableView endUpdates]
  2. Số đếm của mảng indexPaths phải bằng số lượng của các mục bổ sung mà bạn' thêm vào tableView (Tôi nghĩ rằng đó là hiển nhiên, nhưng nó không làm tổn thương để chỉ ra rằng)

đây là một ví dụ rất đơn giản mà sẽ làm việc trên riêng của mình.

@interface MyTableViewController() 
@property (nonatomic, strong) NSMutableArray *expandableArray; 
@property (nonatomic, strong) NSMutableArray *indexPaths; 
@property (nonatomic, strong) UITableView *myTableView; 
@end 

@implementation MyTableViewController 

- (void)viewDidLoad 
{ 
    [self setupArray]; 
} 

- (void)setupArray 
{ 
    self.expandableArray = @[@"One", @"Two", @"Three", @"Four", @"Five"].mutableCopy; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return self.expandableArray.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //here you should create a cell that displays information from self.expandableArray, and return it 
} 

//call this method if your button/cell/whatever is tapped 
- (void)didTapTriggerToChangeTableView 
{ 
    if (/*some condition occurs that makes you want to expand the tableView*/) { 
     [self expandArray] 
    }else if (/*some other condition occurs that makes you want to retract the tableView*/){ 
     [self retractArray] 
    } 
} 

//this example adds 1 item 
- (void)expandArray 
{ 
    //create an array of indexPaths 
    self.indexPaths = [[NSMutableArray alloc] init]; 
    for (int i = theFirstIndexWhereYouWantToInsertYourAdditionalCells; i < theTotalNumberOfAdditionalCellsToInsert + theFirstIndexWhereYouWantToInsertYourAdditionalCells; i++) { 
     [self.indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 
    } 

    //modify your array AND call insertRowsAtIndexPaths:withRowAnimation: INBETWEEN beginUpdates and endUpdates 
    [self.myTableView beginUpdates]; 
    //HERE IS WHERE YOU NEED TO ALTER self.expandableArray to have the additional/new data values, eg: 
    [self.expandableArray addObject:@"Six"]; 
    [self.myTableView insertRowsAtIndexPaths:self.indexPaths withRowAnimation:(UITableViewRowAnimationFade)]; //or a rowAnimation of your choice 

    [self.myTableView endUpdates]; 
} 

//this example removes all but the first 3 items 
- (void)retractArray 
{ 
    NSRange range; 
    range.location = 3; 
    range.length = self.expandableArray.count - 3; 

    //modify your array AND call insertRowsAtIndexPaths:withRowAnimation: INBETWEEN beginUpdates and endUpdates 
    [self.myTableView beginUpdates]; 
    [self.expandableArray removeObjectsInRange:range]; 
    [self.myTableView deleteRowsAtIndexPaths:self.indexPaths withRowAnimation:UITableViewRowAnimationFade]; //or a rowAnimation of your choice 
    [self.myTableView endUpdates]; 
} 

@end 

Tôi hy vọng điều này sẽ giúp bạn tiết kiệm rất nhiều thời gian và đau đầu. Nếu bạn làm theo cách này, bạn không cần phải tải lại toàn bộ tableView để cập nhật nó và bạn có thể chọn một hoạt ảnh cho nó. Mã miễn phí, đừng gõ nó.

+0

tôi có một kịch bản tương tự. tôi có mảng với 76 đối tượng (xấp xỉ). trong khi populating tableview, bảng có thể chỉ hiển thị 10 ô cùng một lúc. 0-10 đối tượng đầu tiên sau đó nhấn vào bảng nút tiếp theo sẽ hiển thị 11-20 dữ liệu, sau đó 21-30 và vv ... vậy làm thế nào tôi có thể làm như thế này? bạn có ý tưởng gì về điều này không? – Moxarth

Các vấn đề liên quan