Programação iOS

O método anterior deveria ter funcionado. Eu já o fiz e deu...

Mais logo, depois de jantar, tento criar um projecto para experimentar isso das sombras.
 
Boas,

Estou a tentar passar informação de uma uiview para outra usando protocol e delegate. Já fiz isso antes sem problema, mas desta vez não. Talvez seja por estar a chamar a 2ª view através de um botão que está dentro de uma tableviewcell...deve-me estar a escapar alguma declaração. O compilador não me dá erros mas também não executa a função. A 2ª view a ser chamada, vai depender do conteúdo da tableviewcell.

Tenho um goWODprotocol.swift:


Código:
import Foundation
protocol goWODControllerDelegate: class {
    func setGoWODForTime(_ wodName: String, _ wodExercises: [String])
}

Depois tenho o 1º uiviewcontroller

Código:
class WodLibraryVC: UIViewController, ...{

weak var delegate: goWODControllerDelegate?
.....

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       
        if let cell = tableView.dequeueReusableCell(withIdentifier: "wodCell", for: indexPath) as? WodCell{
....
cell.tapAction = { (cell) in
                self.delegate?.setGoWODForTime(wod.name, wod.exercise)
                let storyboard = UIStoryboard(name: "Main", bundle: nil)
                let vc = storyboard.instantiateViewController(withIdentifier: "WODForTime") as UIViewController
                self.present(vc, animated: true, completion: nil)   
            }
...
}

//Nota: o cell.tapAction é executado

....
}

Depois tenho o 2º uiviewcontroller para onde quero que os dados sejam passados:

Código:
class goWODForTimeVC: UIViewController, goWODControllerDelegate {
...
func setGoWODForTime(_ wodName: String, _ wodExercises: [String]) {
        wodNameLbl.text = wodName
    }
}

Aqui a função setGoWODForTime não está a ser executada. Porquê?
 
Isso à primeira vista está um confusão. Resume o que queres fazer. Apenas queres executar esse delegate method no 2o view controller? Ou usas isso em mais sítios?
 
Olá, estou a tentar usar
Código:
 tableView.estimatedRowHeight = 400
tableView.rowHeight = UITableViewAutomaticDimension
para alterar a altura de uma table cell quando esta é selecionada mas não estou a conseguir.

A consola mostra este erro:
[Warning] Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Se fizer print ao tableView.rowHeight mostra -1.0
Podes-me ajudar? O que estará mal?
 
Alôh malta!

Eu estou a programar para IOS, não em objective -c mas Adobe Air.
Estou há duas semana com um problema que não consigo resolver:
Tenho de fazer um programa que corra inúmeros ficheiros flash (swf), localmente - ficheiros presentes no user documents, por exemplo - e não consigo perceber como, por a Apple não suportar flash.
Já ponderei converter os ficheiros swf em video mas assim perderiam a interactividade.
Em último caso, ponderei converter os swf em .epub (pois suporta interactividade), mas já li que o desempenho de um .epub carregado numa aplicação móvel não é fiável.

Não sei mesmo para onde me virar. Escusado será dizer que HTML5 não é uma opção.

Se me puderem ajudar, agradeço imenso
 
Olá, estou a tentar usar
Código:
 tableView.estimatedRowHeight = 400
tableView.rowHeight = UITableViewAutomaticDimension
para alterar a altura de uma table cell quando esta é selecionada mas não estou a conseguir.

A consola mostra este erro:
[Warning] Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Se fizer print ao tableView.rowHeight mostra -1.0
Podes-me ajudar? O que estará mal?

Que altura deste a celula no storyboard? Em vez de colocares 400, coloca 400.0 sff
 
Olá, estou a tentar usar
Código:
 tableView.estimatedRowHeight = 400
tableView.rowHeight = UITableViewAutomaticDimension
para alterar a altura de uma table cell quando esta é selecionada mas não estou a conseguir.

A consola mostra este erro:
[Warning] Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Se fizer print ao tableView.rowHeight mostra -1.0
Podes-me ajudar? O que estará mal?

Significa que as constraints que tens na Cell são ambíguas e o auto-layout não as sabe resolver. Isso pode acontecer por teres duas constraints semelhantes com a mesma prioridade. Imagina que tinhas uma label que tinha a constraint de estar a 20 pontos do top e a constraint a 30 pontos do top, se ambas tivessem 1000 de prioridade o auto-layout poderia atrapalhar-se.

Se tens a certeza que todas as tuas constraints estão correctas, experimenta mudar a prioridade de algumas de 1000 para 999/950/whatever.

Se deres mais detalhes sobre a cell e sobre a hierarquia de views interna, será mais fácil encontrar o culpado.

Que altura deste a celula no storyboard? Em vez de colocares 400, coloca 400.0 sff

Duvido que o problema seja esse. Visto ele estar a usar automatic-dimension a cell deveria redimensionar-se com base nas suas subviews. O problema pode efectivamente ser esse, mas assim com a informação dada, penso que seja outro.
 
Última edição:
Que altura deste a celula no storyboard? Em vez de colocares 400, coloca 400.0 sff

Testado. Não é disso, obrigado pela sugestão.

Se tens a certeza que todas as tuas constraints estão correctas, experimenta mudar a prioridade de algumas de 1000 para 999/950/whatever.

Certezas não tenho, mas acho que não há conflitos. Já coloquei todas as constrains com prioridades diferentes mas o resultado é exactamente o mesmo.

Se deres mais detalhes sobre a cell e sobre a hierarquia de views interna, será mais fácil encontrar o culpado.

Que detalhes precisas?

Há a view principal, dentro dessa no mesmo nível hierárquico tenho várias coisas entre elas uma table view.

Essa table tem uma Cell, abaixo da Cell está o Content View e dentro deste Content tenho 3 labels e um button.

A primeira label está alinhada horizontalmente com o button. A altura inicial da Cell faz com que esta label e button estejam visíveis e as outras duas labels "tapadas".

Por baixo da 1ª label está a 2ª label e por baixo da 2ª, a 3ª.
 
Há a view principal, dentro dessa no mesmo nível hierárquico tenho várias coisas entre elas uma table view.

Essa table tem uma Cell, abaixo da Cell está o Content View e dentro deste Content tenho 3 labels e um button.

A primeira label está alinhada horizontalmente com o button. A altura inicial da Cell faz com que esta label e button estejam visíveis e as outras duas labels "tapadas".

Por baixo da 1ª label está a 2ª label e por baixo da 2ª, a 3ª.

O que está acontecer e não querias? O que é/não é mostrado?
 
Olá, vou tentar explicar. Se não perceberes avisa que eu tento explicar melhor.

Como disse tenho 3 labels. Digamos que a 1ª é o titulo e as 2ª e 3ª são descrição. A ideia é ter a altura das células a 55 (e está). Com altura 55 fica visível o titulo e o botão. Ao seleccionar uma célula, a altura dessa célula deveria aumentar (para um valor que deveria ser calculado automaticamente) para que a descrição também ficasse visível.

O que acontece é que ao seleccionar uma célula, nota-se que a altura muda muito ligeiramente, para menos, em vez de aumentar. Na consola vejo o warning que postei antes. Ao fazer print ao rowHeight calculado, vejo -1.0.

Se usar a função heightForRowAt para mudar a altura quando uma célula é seleccionada funciona. Mas neste caso estou simplesmente a forçar um valor de altura, não estou a usar o AutomaticDimension, e por isso essa altura é sempre a mesma em vez de variar conforme o conteúdo da descrição.
 
@elfo106, ok, estou a ver. Dependendo do caso de uso concreto e da possibilidade de texto maior, não aconselhava um height fixo na label, aconselharia antes o número de linhas a 0 e o posicionamento das labels relativo entre elas, assim mesmo que o texto seja mais longo, nada fica cortado. Mas isso são detalhes.

Primeiro aconselho a meteres as labels da seguinte forma:

A primeira com uma distância x ao topo, a segunda com distância x da primeira, a terceira com x da segunda e x do bottom. coloca texto nas 3 e vê se ficam como querias com a cell expandida, isto é o primeiro passo.

Estando isso a funcionar, o que podes fazer é na primeira label criar uma constraint de distância ao bottom da cell de x (a mesma distância que tem para a segunda label) e criar os IBOutlets dessa constraint e da constraint entre a terceira label e o bottom. Depois basta ao seleccionar a cell alterar entre as constraints activas e inactivas. Isto é, se a constraint do bottom da primeira label estiver activa, a do bottom da terceira está inactiva, assim a cell ficará com o tamanho menor.

Se não tiver sido explicíto diz, que eu meto um projectozito com um exemplo no Github.

PS: apaga o método heightForRowAt ou então faz apenas return de UITableViewCellAutomaticDimension. Não tenhas lá números.

PS2: Ignora o tamanho da cell, não mexas lá Mexe só nos constraints das subviews (labels, neste caso) e não te preocupes que a cell se redimensiona automaticamente.
 
@elfo106, ok, estou a ver. Dependendo do caso de uso concreto e da possibilidade de texto maior, não aconselhava um height fixo na label, aconselharia antes o número de linhas a 0 e o posicionamento das labels relativo entre elas, assim mesmo que o texto seja mais longo, nada fica cortado. Mas isso são detalhes.

É assim mesmo que tenho :)


A primeira com uma distância x ao topo, a segunda com distância x da primeira, a terceira com x da segunda e x do bottom. coloca texto nas 3 e vê se ficam como querias com a cell expandida, isto é o primeiro passo.

Eu quando forço a altura da célula para ficar tudo visível, fica tudo como pretendo.

Estando isso a funcionar, o que podes fazer é na primeira label criar uma constraint de distância ao bottom da cell de x (a mesma distância que tem para a segunda label) e criar os IBOutlets dessa constraint e da constraint entre a terceira label e o bottom. Depois basta ao seleccionar a cell alterar entre as constraints activas e inactivas. Isto é, se a constraint do bottom da primeira label estiver activa, a do bottom da terceira está inactiva, assim a cell ficará com o tamanho menor.

Se não tiver sido explicíto diz, que eu meto um projectozito com um exemplo no Github.

Sinceramente fiquei baralhado....podes postar um exemplo pf?

PS: apaga o método heightForRowAt ou então faz apenas return de UITableViewCellAutomaticDimension. Não tenhas lá números.

Não estou a usar. Usei apenas para testar.

PS2: Ignora o tamanho da cell, não mexas lá Mexe só nos constraints das subviews (labels, neste caso) e não te preocupes que a cell se redimensiona automaticamente.

Tenho que indicar qual é o tamanho inicial. Ou não? Eu apenas quero que o redimensionamento seja feito quando a cell for seleccionada.
 
Não tens que colocar tamanho algum. Só precisas de tamanhos/distâncias nas labels, a cell é inteligente ao ponto de se adaptar. A esta hora já não consigo, lembra-me amanhã sff que eu exemplifico.
 
Mas no StoryView, ao selecionar a table, no Size Inspector tem la "Row Height" e aí tem que ter um valor. Se não tem algo me está a escapar...

É com esta altura que a tabela abre...

Claro, eu depois lembro-te caso entretanto não o tenhas feito.

Obrigado!
 
@elfo106, aqui está o que eu estava a falar. Tem pouco código e parece-me fácil de perceber. Eu fiz isso em 5 minutos e nem sequer olhei para o row height. A cell não precisa de saber nada sobre o próprio tamanho, deixa as labels preocuparem-se com isso...
 
Obrigado. Já vi e acho que percebi. Quando começar a implementar passo a ter a certeza ;)

Vou ter que ler sobre a expressão guard let porque ainda não tinha passado por ela e tenho para já uma dúvida em relação às constraints.

Quando se adiciona uma constraint, o espaço é relativo ao "objecto" mais próximo na respectiva direcção. Ao adicionar um bottom space na label 1, estaríamos a criar um espaçamento entre a label 1 e a label 2, mas aqui ficou entre a label 1 e a superview. Foi para conseguires isso que a label 1 está a ocupar toda a prototype Cell e as labels 2 e 3 estão na "região cinzenta" ?
 
Vou ter que ler sobre a expressão guard let porque ainda não tinha passado por ela e tenho para já uma dúvida em relação às constraints.

Ai essa memória... Depois de eu te ter explicado o porquê e o como, já não te lembras?

Quando se adiciona uma constraint, o espaço é relativo ao "objecto" mais próximo na respectiva direcção.

Não. Uma constraint precisa de dois membros, até pode ser uma constraint entre um objecto e ele próprio (comprimento, largura, etc).

Ao adicionar um bottom space na label 1, estaríamos a criar um espaçamento entre a label 1 e a label 2, mas aqui ficou entre a label 1 e a superview. Foi para conseguires isso que a label 1 está a ocupar toda a prototype Cell e as labels 2 e 3 estão na "região cinzenta" ?

Aconselhava-te a ler obre constraints, eu podia explicar mas provavelmente ainda te confundiria mais. Existem por aí n sítios que explicam melhor que eu. Tal como este, ou este.
 
Ai essa memória... Depois de eu te ter explicado o porquê e o como, já não te lembras?

Sinceramente já não me lembrava. Tinha ideia que havia uma relação entre o guard let e o if let mas não me lembrava exatamente qual nem que tinhas sido tu a explicar-me. Desculpa e obrigado :)

Não. Uma constraint precisa de dois membros, até pode ser uma constraint entre um objecto e ele próprio (comprimento, largura, etc).



Aconselhava-te a ler obre constraints, eu podia explicar mas provavelmente ainda te confundiria mais. Existem por aí n sítios que explicam melhor que eu. Tal como este, ou este.

Obrigado pelos links. Vou tratar de os ler.
 
Olá boa noite,

Já consegui implementar. Obrigado pela ajuda!

Vou aproveitar para fazer uma pergunta porque surgiu um problema que já resolvi mas fiquei sem perceber o porquê.

No teu exemplo, na função didSelectRowAt usas tableView.reloadData(). Se eu usar o reload no meu projecto, a cell que expande é a de cima à que eu clico...Troquei o reload por beginUpdates() seguido de endUpdates() e já ficou com o comportamento igual ao do teu exemplo. Porquê??
 
Back
Topo