Các cửa hàng không thể kết nối với nội dung lặp lại iOS


144

Tôi vừa tạo một ứng dụng và đã bắt đầu kết nối @ IBOutlet vào bảng phân cảnh. Tôi đang kết nối một số trong số chúng với các nhãn trong Ô Nguyên mẫu UITableViewCell với Kiểu cơ bản. Khi tôi kết nối nó mặc dù tôi gặp lỗi này trong Storyboard:

Chi tiết Outlet Outlet từ TableViewControll đến UILabel không hợp lệ. Các cửa hàng không thể được kết nối với nội dung lặp lại.

Ai đó có thể giúp tôi không? Tôi đã thiết lập nó theo cách tôi luôn làm thành công nhưng lần này nó đã gây ra lỗi cho tôi.


54
Bạn không thể kết nối nhãn trong một ô nguyên mẫu với IBOutlet trong lớp con UIViewControll - bạn phải kết nối nó với IBOutlet trong lớp con UITableviewCell.
Paulw11

Được rồi cảm ơn! :) Vì vậy, để tôi hiểu: bạn có thể giải thích tại sao?
Tomblasta

3
Bởi vì bạn có thể có bất kỳ số lượng ô nào và chỉ có một bộ điều khiển chế độ xem duy nhất - vậy nhãn của ô nào sẽ được kết nối với bộ điều khiển xem IBOutlet?
Paulw11

Ok, vậy tại sao bạn không thể sử dụng cellForRowAtIndexPath cho văn bản ô trong một bộ điều khiển xem đơn? Cảm ơn!
Tomblasta

3
Bởi vì các đầu ra bị ràng buộc với các đối tượng (chẳng hạn như nhãn) khi bộ điều khiển xem được tải- Tại thời điểm đó không có ô nào, vì vậy không có nhãn nào để liên kết và nếu có ô, bạn muốn liên kết với ô nào
Paulw11

Câu trả lời:


168

Tạo một lớp con ô xem bảng và đặt nó làm lớp của nguyên mẫu. Thêm các cửa hàng vào lớp đó và kết nối chúng. Bây giờ khi bạn cấu hình ô, bạn có thể truy cập các cửa hàng.


9
@Wain bạn có thể vui lòng thêm thông tin về việc gia nhập các cửa hàng đó không?
Juan Boero

1
Juan Pablo - Điều anh ấy nói là việc sử dụng một ô xem bảng tùy chỉnh là bình thường. Bạn không thể đặt ổ cắm cho một ràng buộc bên trong chế độ xem nơi bạn đang sử dụng ô, thay vào đó, bạn cần thực hiện điều đó trong cellForRowAtIndexPath chẳng hạn - customCell.constraint_row_ference.constant = 25.0;
Stuart P.

70

Có hai loại ô xem bảng được cung cấp cho bạn thông qua bảng phân cảnh, chúng là Nguyên mẫu độngÔ tĩnh

nhập mô tả hình ảnh ở đây

1. Nguyên mẫu động

Từ tên, loại tế bào này được tạo ra một cách linh hoạt. Chúng được kiểm soát thông qua mã của bạn, không phải bảng phân cảnh. Với sự trợ giúp của đại biểu và nguồn dữ liệu của chế độ xem bảng, bạn có thể chỉ định số lượng ô, chiều cao của các ô, nguyên mẫu của các ô theo chương trình.

Khi bạn kéo một ô vào chế độ xem bảng của mình, bạn đang khai báo một nguyên mẫu của các ô. Sau đó, bạn có thể tạo bất kỳ số lượng ô nào dựa trên nguyên mẫu này và thêm chúng vào chế độ xem bảng thông qua cellForRowphương thức, theo lập trình. Ưu điểm của việc này là bạn chỉ cần xác định 1 nguyên mẫu thay vì tự tạo từng ô với tất cả các khung nhìn được thêm vào chúng (Xem ô tĩnh).

Vì vậy, trong trường hợp này, bạn không thể kết nối các thành phần UI trên nguyên mẫu ô với bộ điều khiển xem của bạn. Bạn sẽ chỉ có một đối tượng điều khiển xem được khởi tạo, nhưng bạn có thể có nhiều đối tượng ô được khởi tạo và thêm vào chế độ xem bảng của bạn. Việc kết nối nguyên mẫu ô để xem bộ điều khiển là không hợp lý vì bạn không thể điều khiển nhiều ô bằng kết nối bộ điều khiển một chế độ xem. Và bạn sẽ nhận được một lỗi nếu bạn làm như vậy.

nhập mô tả hình ảnh ở đây

Để khắc phục vấn đề này, bạn cần kết nối nhãn nguyên mẫu của mình với một UITableViewCellđối tượng. A UITableViewCellcũng là một nguyên mẫu của các ô và bạn có thể khởi tạo bao nhiêu đối tượng ô mà bạn muốn, mỗi đối tượng sau đó được kết nối với một khung nhìn được tạo từ nguyên mẫu ô của bảng phân cảnh của bạn.

nhập mô tả hình ảnh ở đây

Cuối cùng, trong cellForRowphương thức của bạn , tạo ô tùy chỉnh từ UITableViewCelllớp và thực hiện các công cụ thú vị với nhãn

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifier") as! YourCell

    cell.label.text = "it works!"

    return cell
}

2. Tế bào tĩnh

Mặt khác, các ô tĩnh thực sự được cấu hình qua bảng phân cảnh. Bạn phải kéo các thành phần UI đến từng ô để tạo chúng. Bạn sẽ kiểm soát số lượng tế bào, chiều cao, vv từ bảng phân cảnh. Trong trường hợp này, bạn sẽ thấy chế độ xem bảng hoàn toàn giống với điện thoại của bạn so với những gì bạn đã tạo từ bảng phân cảnh. Các ô tĩnh thường được sử dụng để cài đặt trang, mà các ô không thay đổi nhiều.

Để kiểm soát các thành phần UI cho một ô tĩnh, bạn thực sự sẽ cần kết nối chúng trực tiếp với bộ điều khiển xem của bạn và thiết lập chúng.

nhập mô tả hình ảnh ở đây


@FangmingNing trong mã của tôi, tôi vẫn không thể thay đổi nhãn văn bản, tôi đã kết nối lớp với ô, được gọi là ô chính xác với mã định danh, nhưng vẫn không thay đổi
jorge saraiva

@jorgesaraiva Hãy thảo luận về vấn đề này trong phòng trò chuyện.stackoverflow.com/rooms/159394/discuss
Fangming

Tôi đã mất tích như! YourCell . +100
Daniel Springer

Luôn luôn tốt để có một chút bồi dưỡng sau khi làm việc trên một dự án chỉ trong 6 tháng.
ttorbik

Cảm ơn, vấn đề của tôi là tôi đang kết nối nó với ViewContoder chứ không phải là tế bào.
Stella

23

Nếu bạn đang sử dụng một cái nhìn bảng để Cài đặt hiển thị và tùy chọn khác (như các ứng dụng tích hợp trong Cài đặt làm), sau đó bạn có thể thiết lập của bạn bảng Xem nội dung để tế bào tĩnh dưới các thuộc tính Inspector . Ngoài ra, để làm điều này, bạn phải nhúng Chế độ xem bảng của bạn trong một phiên bản UITableViewCont kiểm soát.


Đây là cách đơn giản và nhanh chóng hơn và nên là câu trả lời được chấp nhận imho
Jaime Agudo

5

Hoặc bạn không phải sử dụng IBOutlet để chỉ đối tượng trong chế độ xem. Bạn có thể cung cấp Nhãn trong bảngViewCell một giá trị Thẻ, ví dụ đặt Thẻ thành 123 (điều này có thể được thực hiện bởi trình kiểm tra thuộc tính). Sau đó, bạn có thể truy cập nhãn bằng cách

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "someID", for: indexPath)

    let label = cell.viewWithTag(123) as! UILabel //refer the label by Tag

    switch indexPath.row {
    case 0:
        label.text = "Hello World!"
    default:
        label.text = "Default"
    }
    return cell 
}

rất dễ dàng và đơn giản +100
Julian Silvestri

1

Với tôi, tôi có một cái UIViewcontroller, và trong đó tôi có một cái bàn với một ô tùy chỉnh trên đó. Tôi ánh xạ ổ cắm UILabel của mình vào UItableviewcellUIViewControllersau đó gặp lỗi.


tạo lớp ô tùy chỉnh và khởi tạo iboutlet trong lớp tùy chỉnh này của bạn
Shauket Sheikh

0

Như hầu hết mọi người đã chỉ ra rằng phân lớp UITableViewCell giải quyết vấn đề này. Nhưng lý do điều này không được phép vì ô nguyên mẫu ( UITableViewCell ) được xác định bởi Apple và bạn không thể thêm bất kỳ cửa hàng nào của riêng mình vào nó.


0

Đôi khi Xcode không thể kiểm soát kết nối ổ cắm di động chính xác.

Bằng cách nào đó, nhãn / nút của ô hiện tại của tôi đã kết nối với một ô khác. Tôi chỉ xóa những ô đó và lỗi sẽ biến mất.


-1

Nhấp vào trình giả lập, Điều hướng đến Cửa sổ và bật Thiết bị Bezels

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.