Não é possível conectar tomadas para repetir o conteúdo do iOS

144

Acabei de criar um aplicativo e comecei a conectar o @ IBOutlet no storyboard. Estou conectando alguns deles a rótulos em uma célula de protótipo UITableViewCell com um estilo básico. Quando o conecto, recebo esse erro no Storyboard:

A saída detailText do TableViewController para o UILabel é inválida. As tomadas não podem ser conectadas ao conteúdo repetido.

Alguém pode me ajudar? Eu configurei da maneira que sempre faço com sucesso, mas desta vez ele me lançou esse erro.

Tomblasta
fonte
54
Você não pode conectar um rótulo em uma célula protótipo a um IBOutlet em uma subclasse UIViewController - você deve conectá-lo a um IBOutlet em uma subclasse UITableviewCell.
Paulw11
Ok, obrigado! :) Então, só para eu entender: você pode explicar o porquê?
Tomblasta
3
Como você pode ter qualquer número de células e apenas um único controlador de exibição - então qual rótulo da célula deve ser conectado ao IBOutlet dos controladores de exibição?
Paulw11
Ok, então por que você não pode simplesmente usar o cellForRowAtIndexPath para o texto da célula em um único controlador de exibição? Obrigado!
Tomblasta
3
Como as saídas são vinculadas a objetos (como rótulos) quando o controlador de exibição é carregado - Nesse ponto, não há células, portanto, nenhum rótulo a ser vinculado e, se houver células, qual você deseja vincular
Paulw11

Respostas:

168

Crie uma subclasse de célula de exibição de tabela e defina-a como a classe do protótipo. Adicione as saídas a essa classe e conecte-as. Agora, quando você configura a célula, pode acessar as tomadas.

Wain
fonte
9
@ Wain, você poderia adicionar mais informações sobre como acessar essas lojas?
Juan Boero
1
Juan Pablo - O que ele está dizendo é que é normal usar uma célula de exibição de tabela personalizada. Você não pode definir a saída para uma restrição dentro da visualização em que está usando a célula; em vez disso, você precisará fazer isso no cellForRowAtIndexPath, por exemplo - customCell.constraint_row_width.constant = 25.0;
Stuart P.
70

Existem dois tipos de células de visualização de tabela fornecidas a você através do storyboard: eles são protótipos dinâmicos e células estáticas

insira a descrição da imagem aqui

1. Protótipos Dinâmicos

A partir do nome, esse tipo de célula é gerado dinamicamente. Eles são controlados pelo seu código, não pelo storyboard. Com a ajuda do delegado e da fonte de dados da exibição de tabela, você pode especificar o número de células, a altura das células e o protótipo de células programaticamente.

Quando você arrasta uma célula para a visualização da tabela, está declarando um protótipo de células. Você pode criar qualquer quantidade de células com base nesse protótipo e adicioná-las à exibição de tabela por meio do cellForRowmétodo, programaticamente. A vantagem disso é que você só precisa definir 1 protótipo em vez de criar cada célula com todas as visualizações adicionadas a você (consulte a célula estática).

Portanto, nesse caso, você não pode conectar elementos da interface do usuário no protótipo de célula ao seu controlador de exibição. Você terá apenas um objeto controlador de visualização iniciado, mas poderá ter muitos objetos de célula iniciados e adicionados à sua visualização de tabela. Não faz sentido conectar o protótipo de célula para visualizar o controlador porque você não pode controlar várias células com uma conexão de controlador de visualização. E você receberá um erro se fizer isso.

insira a descrição da imagem aqui

Para corrigir esse problema, você precisa conectar o rótulo do protótipo a um UITableViewCellobjeto. A UITableViewCelltambém é um protótipo de células e você pode iniciar quantos objetos de célula desejar, e cada um deles será conectado a uma exibição gerada a partir do protótipo de célula da tabela de storyboard.

insira a descrição da imagem aqui

Finalmente, no seu cellForRowmétodo, crie a célula personalizada da UITableViewCellclasse e faça coisas divertidas com o rótulo

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. Células Estáticas

Por outro lado, as células estáticas são realmente configuradas no storyboard. Você precisa arrastar elementos da interface do usuário para cada célula para criá-los. Você estará controlando números de células, alturas, etc. a partir do storyboard. Nesse caso, você verá uma exibição de tabela exatamente igual ao seu telefone em comparação com o que você criou no storyboard. As células estáticas são usadas com mais frequência na página de configuração, que não muda muito.

Para controlar os elementos da interface do usuário para uma célula estática, você precisará conectá-los diretamente ao seu controlador de exibição e configurá-los.

insira a descrição da imagem aqui

Fangming
fonte
@FangmingNing no meu código, eu ainda não pode mudar rótulo de texto, eu tenho classe conectado ao celular, chamado de célula correta com identificador, mas ainda não mudar
Jorge Saraiva
@jorgesaraiva Vamos discutir isso na sala de bate-papo chat.stackoverflow.com/rooms/159396/discuss
Fangming
Eu estava faltando como! YourCell . +100
Daniel Springer
É sempre bom ter um pouco de atualização depois de trabalhar em um projeto em apenas código por 6 meses.
ttorbik
Obrigado, meu problema é que estou conectando-o ao ViewController e não à célula.
Stella
23

Se você estiver usando uma visualização de tabela para exibir Configurações e outras opções (como o aplicativo Configurações interno), poderá definir o Conteúdo da Visualização de tabela como Células estáticas no Inspetor de atributos . Além disso, para fazer isso, você deve incorporar seu Table View em uma instância UITableViewController.

Justin Domnitz
fonte
Esta é, de maneira mais simples e mais rápido e deve ser a resposta imho aceito
Jaime Agudo
5

Ou você não precisa usar o IBOutlet para se referir ao objeto na exibição. Você pode atribuir ao Label no tableViewCell um valor de Tag, por exemplo, defina o Tag como 123 (isso pode ser feito pelo inspetor de atributos). Então você pode acessar o rótulo pressionando

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 
}
SLN
fonte
muito fácil e simples! +100
Julian Silvestri
1

Comigo eu tenho um UIViewcontroller, e nele tenho uma tableview com uma célula personalizada. Mapeio minha saída do UILabel UItableviewcellpara UIViewControllero erro em seguida.

lee
fonte
fazer classe de células personalizado e IBOutlet instanciar em sua esta classe personalizada
Shauket Sheikh
0

Como a maioria das pessoas apontou, a subclasse UITableViewCell resolve esse problema. Mas o motivo não é permitido porque a célula protótipo ( UITableViewCell ) é definida pela Apple e você não pode adicionar nenhuma de suas próprias saídas.

Nikhil Muskur
fonte
0

Às vezes, o Xcode não conseguia controlar a conexão correta da tomada de célula.

De alguma forma, o rótulo / botão da minha célula atual conectou outra célula, apenas as removi e o erro desaparece.

Shourob Datta
fonte
-1

Clique no simulador, navegue até a janela e ative a moldura dos dispositivos

automação eng
fonte