2013-07-12 16 views
9

Tôi cần một nhóm UITableView tương tự như cho các tài khoản Twitter trong ứng dụng Cài đặt:Trộn phần tĩnh và động trong một cái nhìn bảng nhóm

Twitter accounts

Đó là, một loại hình thức hoặc trình đơn nơi một số các phần có tập hợp các ô tĩnh đã biết trước đó và một số phần khác phải động và cho phép chèn các hàng bổ sung giống như cách "Thêm tài khoản" ở đây. Tôi đang quản lý UITableView trong một tệp .xib. Đối với các ô tĩnh, tôi đã tách các tệp .xib mà tôi có thể tải trong phương thức cellForRowAtIndexPath: trong trình điều khiển chế độ xem.

Tôi nên xử lý loại bảng này như thế nào? Tôi không tìm thấy bất kỳ mã ví dụ nào.

Phương thức cellForRowAtIndexPath: sẽ như thế nào? Tôi có thể cần giữ các thuộc tính strong cho các ô tĩnh không? Nó sẽ được tốt hơn để thiết kế mỗi tế bào tĩnh trực tiếp trong cùng một tập tin .xib nơi xem bảng, và để thiết lập các cửa hàng cho họ? (Mặc dù điều này không cho phép tái sử dụng thiết kế ô tùy chỉnh của tôi ...)

Tôi cần một số nguyên tắc để đạt được điều này và quản lý chính xác các ô và bộ nhớ. Cảm ơn trước

+0

Tôi không nghĩ bạn có thể kết hợp các ô tĩnh với các ô động - đó là thuộc tính của chế độ xem bảng, vì vậy tôi nghĩ rằng nó cần phải là một hoặc cái kia. Không có gì bạn không thể làm với một tế bào năng động mà bạn có thể làm với một tế bào tĩnh, vì vậy chỉ cần làm cho nó tất cả năng động. – rdelmar

+0

@rdelmar Ok, có thể tôi đang đặt tên cho mọi thứ theo cách sai ... ý tôi muốn nói với "tĩnh" và "động" chỉ là tôi có một bộ phận có các ô mà tôi đã biết và sẽ không thay đổi (là ô biểu trưng Twitter và ô "Cập nhật liên hệ" trong ảnh chụp màn hình) và một bộ phần khác sẽ có bộ ô thay đổi khi người dùng cung cấp thông tin mới (dưới dạng "Thêm tài khoản") – AppsDev

+0

@rdelmar Vì hiện có ví dụ về những gì tôi cần (ảnh chụp màn hình mà tôi đã cung cấp và chức năng "Liên hệ mới" trong ứng dụng Điện thoại), có thể thực hiện ... câu hỏi là, làm cách nào? Tôi không sử dụng bảng phân cảnh ... – AppsDev

Trả lời

27

Các ô mẫu động có thể hoạt động như các ô tĩnh nếu bạn chỉ trả lại ô mà không thêm bất kỳ nội dung nào trong cellForRowAtIndexPath, vì vậy bạn có thể có cả ô "tĩnh giống" và ô động (nơi số hàng và nội dung biến) bằng cách sử dụng các nguyên mẫu động. Trong ví dụ dưới đây, tôi bắt đầu với bộ điều khiển xem bảng trong IB (với chế độ xem bảng được nhóm) và thay đổi số lượng ô mẫu thử nghiệm động thành 3. Tôi đã điều chỉnh kích thước của ô đầu tiên thành 80 và được thêm vào một UIImageView và hai nhãn. Ô giữa là ô Kiểu cơ bản và ô cuối cùng là một ô tùy chỉnh khác có một nhãn căn giữa. Tôi đã cung cấp cho họ từng mã nhận diện riêng của họ.Đây là những gì nó trông giống như trong IB:

enter image description here

Sau đó trong mã, tôi đã làm điều này:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.theData = @[@"One",@"Two",@"Three",@"Four",@"Five"]; 
    [self.tableView reloadData]; 
} 

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    if (section == 1) 
     return self.theData.count; 
    return 1; 
} 

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.section == 0) 
     return 80; 
    return 44; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell; 

    if (indexPath.section == 0) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"TitleCell" forIndexPath:indexPath]; 

    }else if (indexPath.section == 1) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"DataCell" forIndexPath:indexPath]; 
     cell.textLabel.text = self.theData[indexPath.row]; 

    }else if (indexPath.section == 2) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"ButtonCell" forIndexPath:indexPath]; 
    } 

    return cell; 
} 

Như bạn có thể thấy, cho "tĩnh như" tế bào, tôi chỉ trả lại ô với số nhận dạng chính xác và tôi nhận được chính xác những gì tôi đã thiết lập trong IB. Kết quả trong thời gian chạy sẽ giống như hình ảnh đã đăng của bạn với ba phần.

+0

Cảm ơn bạn đã giải thích và đoạn mã. Nếu thay vì có các ô như các cửa hàng trong IB, tôi tải chúng từ tệp 'xib' của riêng chúng (để có thể sử dụng lại kiểu tùy chỉnh ô trong các bảng khác), phương thức' cellForRowAtIndexPath: 'trông như thế nào? Tôi cần liên kết các ô với các thuộc tính mạnh? – AppsDev

+1

@AppsDev, nó sẽ không khác gì. Bạn chỉ cần đăng ký các ngòi ngách trong viewDidLoad. Vì vậy, đối với mỗi loại tế bào bạn cần phải viết một cái gì đó như: [self.tableView registerNib: [UINib nibWithNibName: @ "YourNibNameHere" bundle: nil] forCellReuseIdentifier: @ "TitleCell"]; Bạn không cần bất kỳ thuộc tính nào. – rdelmar

+0

cảm ơn! Sau đó, nếu tôi muốn truy cập các điều khiển trong các ô tùy chỉnh của mình (tôi có trường văn bản và công tắc), tốt hơn là tìm các ô trong bảng nếu cần, thay vì giữ tham chiếu cho mỗi ô riêng lẻ? – AppsDev

2

Tĩnh chỉ là một điều khoản trên bố cục động. Về cơ bản tĩnh là một WYSIWYG.

Nếu bạn không chống lại thử nghiệm với các giá trị, tôi khuyên bạn nên sử dụng tính năng động. Có hàng trăm ví dụ có sẵn, chẳng hạn như thisthis.

Như bạn đi xa hơn, bạn sẽ thấy mình phân kỳ đối với hai lựa chọn khi tùy chỉnh xem bảng động:

  • Subclass UITableViewCell (nỗ lực nhiều hơn, nhưng tốt trong thời gian dài). Một lần nữa, hãy theo dõi this.
  • Chơi với UITableViewCell thuộc tính bên trong cellForRowAtIndexPath: (nỗ lực ít hơn và kết quả nhanh nhưng có thể hoặc có thể không hoạt động thân thiện có thể là do vẽ lại)

Các khả năng là vô tận, chẳng hạn như here nơi xem nền tế bào được tùy chỉnh .

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