ChatGPT解决这个技术问题 Extra ChatGPT

Outlets cannot be connected to repeating content iOS

I have just created an app and have started hooking up @IBOutlet's to the storyboard. I am connecting some of them to labels in a UITableViewCell Prototype Cell with a Basic Style. When I connect it though I get this error in the Storyboard:

The detailText Outlet from the TableViewController to the UILabel is invalid. Outlets cannot be connected to repeating content.

Can someone help me out? I have set it up the way I always do successfully but this time it has chucked me this error.

You can't connect a label in a prototype cell to an IBOutlet in a UIViewController subclass - you have to connect it to an IBOutlet in a UITableviewCell subclass.
Ok Thanks! :) So just so I understand: can you explain why?
Because you can have any number of cells and only a single view controller - so which cell's label should be connected to the view controllers IBOutlet?
Ok, so why couldn't you just use the cellForRowAtIndexPath for the cell text in one single view controller? Thanks!
Because outlets are bound to objects (such as labels) when the view controller is loaded- At that point there are no cells, so no label to bind, and if there were cells, which one did you want to bind

W
Wain

Create a table view cell subclass and set it as the class of the prototype. Add the outlets to that class and connect them. Now when you configure the cell you can access the outlets.


@Wain could you please add more information on accesing those outlets?
Juan Pablo - What he's saying is that it's normal to use a custom table view cell. You can't set the outlet for a constraint inside the view where you're using the cell, instead you'd need to do that in cellForRowAtIndexPath for example - customCell.constraint_row_width.constant = 25.0;
B
Brett Green

There are two types of table views cells provided to you through the storyboard, they are Dynamic Prototypes and Static Cells

https://i.stack.imgur.com/aYzxr.gif

1. Dynamic Prototypes

From the name, this type of cell is generated dynamically. They are controlled through your code, not the storyboard. With help of table view's delegate and data source, you can specify the number of cells, heights of cells, prototype of cells programmatically.

When you drag a cell to your table view, you are declaring a prototype of cells. You can then create any amount of cells base on this prototype and add them to the table view through cellForRow method, programmatically. The advantage of this is that you only need to define 1 prototype instead of creating each and every cell with all views added to them by yourself (See static cell).

So in this case, you cannot connect UI elements on cell prototype to your view controller. You will have only one view controller object initiated, but you may have many cell objects initiated and added to your table view. It doesn't make sense to connect cell prototype to view controller because you cannot control multiple cells with one view controller connection. And you will get an error if you do so.

https://i.stack.imgur.com/Qhfxn.gif

To fix this problem, you need to connect your prototype label to a UITableViewCell object. A UITableViewCell is also a prototype of cells and you can initiate as many cell objects as you want, each of them is then connected to a view that is generated from your storyboard table cell prototype.

https://i.stack.imgur.com/cpjjl.gif

Finally, in your cellForRow method, create the custom cell from the UITableViewCell class, and do fun stuff with the label

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. Static Cells

On the other hand, static cells are indeed configured though storyboard. You have to drag UI elements to each and every cell to create them. You will be controlling cell numbers, heights, etc from the storyboard. In this case, you will see a table view that is exactly the same from your phone compared with what you created from the storyboard. Static cells are more often used for setting page, which the cells do not change a lot.

To control UI elements for a static cell, you will indeed need to connect them directly to your view controller, and set them up.

https://i.stack.imgur.com/JRbmE.gif


@FangmingNing in my code, i still can't change text label, i have connected class to cell, called correct cell with identifier, but still not changing
@jorgesaraiva Let's discuss this in chat room chat.stackoverflow.com/rooms/159396/discuss
I was missing as! YourCell. +100
Always good to have a little refresher after working on a project in just code for 6 months.
Thanks, my problem is that I am connecting it to the ViewController rather than the cell.
J
Justin Domnitz

If you're using a table view to display Settings and other options (like the built-in Settings app does), then you can set your Table View Content to Static Cells under the Attributes Inspector. Also, to do this, you must embedded your Table View in a UITableViewController instance.


This is by way simpler and quicker and should be the accepted answer imho
S
SLN

Or you don't have to use IBOutlet to refer to the object in the view. You can give the Label in the tableViewCell a Tag value, for example set the Tag to 123 (this can be done by the attributes inspector). Then you can access the label by

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 
}

very easy and simple! +100
l
lee

With me I have a UIViewcontroller, and into it I have a tableview with a custom cell on it. I map my outlet of UILabel into UItableviewcell to the UIViewController then got the error.


make custom cell class and instantiate iboutlet in your this custom class
N
Nikhil Muskur

As most people have pointed out that subclassing UITableViewCell solves this issue. But the reason this not allowed because the prototype cell(UITableViewCell) is defined by Apple and you cannot add any of your own outlets to it.


S
Shourob Datta

Sometimes Xcode could not control over correctly cell outlet connection.

Somehow my current cell’s label/button has connected another cell I just remove those and error goes away.


D
Dilip M

For collectionView :

solution:

From viewcontroller, kindly remove the IBoutlet of colllectionviewcell

. the issue mentions the invalid of your IBOutlet. so remove all subclass which has multi-outlet(invalids) and reconnect it.

The answer is already mentioned in another question for collectionviewcell


a
automation eng

Click on simulator , Navigate to Window and enable Device Bezels


关注公众号,不定期副业成功案例分享
Follow WeChat

Success story sharing

Want to stay one step ahead of the latest teleworks?

Subscribe Now