2011-08-05 38 views
17

Tôi đã có một UITableView mà tôi muốn gắn một subview 44px trên đầu trang của. Tôi đã thử tableViewHeader, nhưng điều đó cuộn với phần còn lại của bảng.Cố định tiêu đề để UITableview?

Tôi đã thử tìm kiếm và đã tìm thấy nhiều người nói rằng tôi cần thêm giám sát UIView và sau đó thêm tiêu đề của tôi và UITableView vào nó. Tuy nhiên tôi không thể tìm thấy một ví dụ về chính xác làm thế nào để làm điều này. Tôi đã cố gắng làm cho một lớp con UIView mới và đặt ra các subviews trong IB, nhưng tôi gặp rắc rối khi nhận được bảng điều khiển để liên kết w/UITable (bởi vì tôi không biết đủ về IB).

Tôi làm cách nào để thực hiện điều này với XIBs? Ai đó có thể cung cấp một ví dụ?

Cảm ơn sự giúp đỡ nào mà các bạn có thể cung cấp.

+0

Bản sao có thể có của [UITableView với tiêu đề phần cố định] (http://stackoverflow.com/questions/17582818/uitableview-with-fixed-section-headers) –

Trả lời

34

Cuối cùng tôi đã tìm ra điều này ngay sau khi đăng. Số liệu. :)

Đây là những gì tôi đã làm, trong trường hợp những người khác chạy vào cùng một vấn đề:

  1. Xóa hiện UITableViewController và XIB của nó. Họ là rác rưởi. Thực sự phát điên khi bạn làm.

  2. Thực hiện một UIViewController lớp mới với một XIB

  3. mở XIB trong IB và thêm công cụ tiêu đề của bạn và một UITableView đến UIView

  4. Trong Outlets IB cho UITableView chắc chắn rằng bạn kết nối đại biểu và DataSource cho Chủ sở hữu tệp của bạn

  5. Trong tiêu đề cho bộ điều khiển chế độ xem của bạn, hãy đảm bảo thêm <UITableViewDelegate, UITableViewDataSource> để triển khai các giao thức này

  6. Thực hiện tất cả các UITableView đại biểu và nguồn dữ liệu phương pháp thông thường mà bạn biết và tình yêu, nhưng trong UIViewController của bạn thay vì cách mà bạn đang sử dụng để làm việc đó thông qua UITableViewController

Sau khi điều này nên làm việc.

+2

Đây phải là câu trả lời được chấp nhận. Việc ghi đè các phương thức hiện có như câu trả lời hiện được chấp nhận không phải là phương sách cuối cùng. –

+11

Tuy nhiên, điều này không giải quyết được vấn đề nếu bạn cần nó là một UITableViewController vì các lý do khác. – Gujamin

+0

@PauldeLange bạn có ý là câu trả lời từ Steve không? những gì là sai với trọng các phương pháp hiện có? – Dejell

9

Vấn đề là, thuộc tính chế độ xem của UITableViewController giống với thuộc tính tableView. Tôi đã có cùng một vấn đề, muốn đặt một số nội dung cố định phía trên bảng. Tôi không muốn thay đổi lớp cơ sở, vì nó cung cấp rất nhiều chức năng tuyệt vời mà tôi không muốn mất hoặc bị gián đoạn.

Việc sửa chữa thực sự dễ dàng. Bí quyết là tạo tập hợp tùy chỉnh và nhận được thuộc tính self.tableView. Sau đó, trong loadView, bạn thay thế khung nhìn bằng UIView mới và thêm tableView vào nó. Sau đó, bạn được tự do thêm các bản xem phụ xung quanh tableView. Đây là cách nó được thực hiện:

Trong tiêu đề:

@interface CustomTableViewController : UITableViewController 
{ 
    UITableView *tableView; 
} 

Trong .m:

- (UITableView*)tableView 
{ 
    return tableView; 
} 

- (void)setTableView:(UITableView *)newTableView 
{ 
    if (newTableView != tableView) 
    { 
     [tableView release]; 
     tableView = [newTableView retain]; 
    }   
} 

- (void)loadView { 
    [super loadView]; 
    //save current tableview, then replace view with a regular uiview 
    self.tableView = (UITableView*)self.view; 
    UIView *replacementView = [[UIView alloc] initWithFrame:self.tableView.frame]; 
    self.view = replacementView; 
    [replacementView release]; 
    [self.view addSubview:self.tableView];  

    //code below adds some custom stuff above the table 
    UIView *customHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)]; 
    customHeader.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:customHeader]; 
    [customHeader release]; 

    self.tableView.frame = CGRectMake(0, customHeader.frame.size.height, self.view.frame.size.width, self.view.frame.size.height - customHeader.frame.size.height); 
} 

Thưởng thức!

+1

bạn nói gì về việc ghi đè các phương thức hiện có = bạn có đề xuất không? – Dejell

+1

Và mã này không hoạt động với ARC – Dejell

+1

Thậm chí nếu nó hoạt động, đó là sai về mặt kỹ thuật, vì các tài liệu nói rõ ràng không gọi 'super' trong loadView (cần được thực hiện để giải pháp này hoạt động). – Anthony

1

Là một lựa chọn có thể nhúng UITableViewController như một phần của giao diện người dùng vào một UIViewController với 'container Xem' yếu tố (chọn một trong Interface Builder từ thư viện đối tượng (trong đó tất cả các quan điểm khác)) .

Bằng cách này bạn có thể sử dụng UITableViewController như xem bình thường (về vị trí) và soạn bất kỳ bố trí bạn cần mà không overwritting bảng hiện chế độ code

EDIT:

để tiếp tục mở rộng câu trả lời của tôi, đây là những bước để thực hiện phương pháp mô tả:

  1. mở bạn storyboar trong xây dựng giao diện
  2. drag'n'drop một yếu tố mới ViewController đến st oryboard từ Object Library để thêm bộ điều khiển mới.
  3. Như một cái nhìn đứa trẻ, drag'n'drop Container View từ Thư viện Object và đặt nó ở bất cứ đâu bên trong ViewController

  4. Container View tạo ra một bộ điều khiển xem và "nhúng" segue như một kết nối. Đó là tiết kiệm để xóa viewcontroller này và để kết nối các Container View với yêu cầu view controller (theo các câu hỏi đó là UITableViewController)

  5. Để kết nối Container View với UITableViewController chỉ cần chọn kiểm soát container view và + kéo đến UITableViewController - chọn "Nhúng" trong menu bật lên

Bây giờ bộ điều khiển sẽ hiển thị bên trong vị trí và ranh giới của vùng chứa.

Có thể nhận liên kết tới bộ điều khiển chế độ xem - hệ thống sẽ kích hoạt phương thức "PrepareForSegue" của bộ điều khiển chế độ xem máy chủ (được tạo ở bước 1 ở trên) và bộ điều khiển nằm trong thuộc tính segue.destinationViewController - người dùng có thể tùy chỉnh nó theo yêu cầu. Chỉ cần chắc chắn để thiết lập một định danh để "nhúng" segue trong xây dựng giao diện - đây là quá trình tương tự giống như cho bất kỳ segues khác.

+0

Bạn có thể mô tả chi tiết trong câu trả lời của bạn như thế nào để làm những gì bạn đã nói? –

+0

@NiteshBorad vui lòng kiểm tra câu trả lời cập nhật của tôi - hãy cho tôi biết nếu nó bao gồm quá trình đủ –

+0

Tôi đã làm điều đó trước khi cập nhật câu trả lời của bạn. Mặc dù, nhờ phản ứng nhanh. Bây giờ câu trả lời của bạn có vẻ hoàn hảo. Nó hoạt động. –

1

Thay thế TableViewController bằng một ViewController, bên trong nó thêm UIView với chiều cao cố định để đặt nội dung cố định mà bạn cần và bên dưới thêm một UITableView.

Tạo một lối thoát để TableView bạn

@IBOutlet weak var tableView: UITableView! 

Bạn có thể tái sử dụng tất cả các funcs bạn đã có loại bỏ các chữ ghi đè ví dụ

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return data.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let c = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell! 
    c.textLabel?.text = "A title" 
    c.detailTextLabel?.text = "A subtitle" 
    return c 
} 

Xem câu trả lời này để thêm sự kiểm soát tự động làm mới nếu bạn cần nó Pull to refresh UITableView without UITableViewController

+3

Nếu bạn cảm thấy rằng câu hỏi này là một bản sao, nó phải được đánh dấu như vậy. Không đăng liên kết lên các bài đăng StackOverflow khác dưới dạng câu trả lời. – JAL

+0

Câu hỏi không trùng lặp, ai đó nói rằng một trong những lý do không thực hiện câu trả lời được chấp nhận là vì họ không thể sử dụng điều khiển làm mới tự động, tôi đang hiển thị cách sử dụng nó với câu trả lời được chấp nhận. Tôi đã có thể làm một bình luận trong câu trả lời được chấp nhận nếu stackoverflow cho phép tôi làm như vậy, nhưng tôi không thể vì nó yêu cầu 50 điểm danh tiếng. – iyepes

0

Xác định UIView tùy chỉnh trong bảng phân cảnh hoặc xib, có tham chiếu IBOutlet cho UIView trong Trình điều khiển chế độ xem đó. Trong phương thức -(void)viewWillAppear:(BOOL)animated viết [self.tableView.superview addSubview:filterHeaderView];, tại đây filterHeaderView là tham chiếu IBOutlet cho chế độ xem tiêu đề của tôi mà tôi muốn thêm làm tiêu đề cố định trong chế độ xem bảng của tôi.

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