Estou ciente de que essa pergunta já foi feita antes, mas as respostas são contraditórias e estou confuso, então, por favor, não me xingue.
Eu quero ter uma UIView
subclasse reutilizável em todo o meu aplicativo. Eu quero descrever a interface usando um arquivo nib.
Agora, digamos que seja uma visualização do indicador de carregamento com um indicador de atividade. Eu gostaria em algum evento para instanciar esta visão e animar em uma visão do controlador de visão. Eu poderia descrever a interface do modo de exibição sem problemas de forma programática, criando os elementos programaticamente e definindo seu quadro dentro de um método init etc.
Como posso fazer isso usando uma ponta? Manter o tamanho fornecido no construtor de interface sem ter que definir um quadro.
Consegui fazer assim, mas tenho certeza de que está errado (é apenas uma vista com um seletor):
- (id)initWithDataSource:(NSDictionary *)dataSource {
self = [super init];
if (self){
self = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@", [self class]] owner:self options:nil] objectAtIndex:0];
self.pickerViewData = dataSource;
[self configurePickerView];
}
return self;
}
Mas estou sobrescrevendo a si mesmo e quando o instanciar:
FSASelectView *selectView = [[FSASelectView alloc] initWithDataSource:selectViewDictionary];
selectView.delegate = self;
selectView.frame = CGRectMake(0, self.view.bottom + 50, [FSASelectView width], [FSASelectView height]);
Tenho que definir manualmente o quadro em vez de retirá-lo do IB.
EDIT: Eu quero criar este modo de exibição personalizado em um controlador de exibição e ter acesso para controlar os elementos do modo de exibição. Eu não quero um novo controlador de visualização.
obrigado
EDITAR: Não sei se essa é a prática recomendada, tenho certeza que não, mas foi assim que fiz:
FSASelectView *selectView = [[[NSBundle mainBundle] loadNibNamed:[NSString stringWithFormat:@"%@",[FSASelectView class]] owner:self options:nil] objectAtIndex:0];
selectView.delegate = self;
[selectView configurePickerViewWithData:ds];
selectView.frame = CGRectMake(0, self.view.bottom + 50, selectView.width, selectView.height);
selectView.alpha = 0.9;
[self.view addSubview:selectView];
[UIView animateWithDuration: 0.25 delay: 0 options:UIViewAnimationOptionAllowUserInteraction |UIViewAnimationOptionCurveEaseInOut animations:^{
selectView.frame = CGRectMake(0, self.view.bottom - selectView.height, selectView.width, selectView.height);
selectView.alpha = 1;
} completion:^(BOOL finished) {
}];
A prática correta ainda é necessária
Isso deveria ter sido feito usando um controlador de visualização e init com o nome nib? Devo ter definido a ponta em algum método de inicialização UIView no código? Ou o que eu fiz está certo?
initWithDataSource
? De qualquer forma, isso funcionará mesmo se você atribuir o proprietário como 'Nil'.Respostas:
Estou usando isso para inicializar as visualizações personalizadas reutilizáveis que tenho.
Observe que você pode usar "firstObject" no final, é um pouco mais limpo. "firstObject" é um método útil para NSArray e NSMutableArray.
Aqui está um exemplo típico de carregamento de um xib para usar como cabeçalho de tabela. Em seu arquivo YourClass.m
Normalmente, no
TopArea.xib
, você clica em Proprietário do arquivo e define o proprietário do arquivo como SuaClasse . Então, na verdade, em YourClass.h você teria propriedades IBOutlet. NoTopArea.xib
, você pode arrastar os controles para essas tomadas.Não se esqueça disso
TopArea.xib
, você pode ter que clicar no próprio View e arrastá-lo para algum outlet, para ter controle sobre ele, se necessário. (Uma dica muito útil é que quando você está fazendo isso para linhas de células da tabela, você absolutamente tem que fazer isso - você deve conectar a própria visualização à propriedade relevante em seu código.)fonte
Se você deseja manter seu
CustomView
e seuxib
independente deFile's Owner
, siga estas etapasFile's Owner
campo vazio.xib
arquivo de seuCustomView
e definaCustom Class
comoCustomView
(nome de sua classe de visualização personalizada)IBOutlet
no.h
arquivo de sua visualização personalizada..xib
arquivo da sua visualização personalizada, clique em visualizar e entreConnection Inspector
. Aqui você encontrará todos os seus IBOutlets que definir no.h
arquivono
.m
arquivo de suaCustomView
classe, substitua oinit
método conforme a seguirAgora, quando você quiser carregar o seu
CustomView
, use a seguinte linha de código[[CustomView alloc] init];
fonte
-init
. Em vez disso, ele chamaráinitWithFrame:
e-awakeFromNib
. Se você escrever o mesmo código para carregar sua visualização como no-init
método, você entrará em um loop infinito.Siga os seguintes passos
UIView
.MyView.xib
.UIViewController
deNSObject
em xib. Veja a imagem abaixoConecte a Visualização do Proprietário do Arquivo à sua Visualização. Veja a imagem abaixo
Altere a classe da sua Visualização para
MyView
. O mesmo que 3.Aqui está o código para carregar o View:
Espero que ajude.
Esclarecimento :
UIViewController
é usado para carregar seu xib e a visualização que oUIViewController
possui é realmente aMyView
que você atribuiu no MyView xib.Demo Fiz uma demonstração aqui
fonte
Respondendo minha própria pergunta cerca de 2 anos depois aqui, mas ...
Ele usa uma extensão de protocolo para que você possa fazer isso sem nenhum código extra para todas as classes.
fonte
Em Swift:
Por exemplo, o nome da sua classe personalizada é
InfoView
No início, você cria arquivos
InfoView.xib
eInfoView.swift
assim:Em seguida, defina
File's Owner
aUIViewController
gostar deste:Renomeie seu
View
paraInfoView
:Clique com o botão direito
File's Owner
e conecte seuview
campo aInfoView
:Certifique-se de que o nome da classe seja
InfoView
:E depois disso, você pode adicionar a ação ao botão em sua classe personalizada sem nenhum problema:
E o uso desta classe personalizada em seu
MainViewController
:fonte
Bem, você pode inicializar o xib usando um controlador de visualização e usar viewController.view. ou faça do jeito que você fez. Apenas fazendo uma
UIView
subclasse como o controlador paraUIView
é uma má ideia.Se você não tiver nenhuma saída de sua visualização personalizada, você pode usar diretamente um
UIViewController
classe para inicializá-la.Atualização: No seu caso:
Caso contrário, você terá que fazer um personalizado
UIViewController
(torná-lo o proprietário do arquivo para que os pontos de venda sejam devidamente conectados).Onde você quiser adicionar a visualização, você pode usar.
No entanto, passar o outro controlador de visão (já sendo usado por outra visão) como o proprietário enquanto carrega o xib não é uma boa ideia, pois a propriedade de visão do controlador será alterada e quando você quiser acessar a visão original, você não tem uma referência a ele.
EDITAR: Você enfrentará esse problema se tiver configurado seu novo xib com o proprietário do arquivo como a mesma
UIViewController
classe principal e vinculado a propriedade da visualização à nova visualização do xib.ie;
O código abaixo irá causar confusão mais tarde, se você escrevê-lo dentro do view carregou
YourMainViewController
. Isso é porque aself.view
partir deste ponto irá se referir à sua visão personalizadafonte