ios - outro - transferir dados iphone 5 para 6




Passando dados entre controladores de exibição (20)

Rápido

Há toneladas e toneladas de explicações aqui e em torno do StackOverflow, mas se você é um iniciante tentando apenas fazer algo básico funcionar, tente assistir a este tutorial do YouTube (é o que me ajudou a finalmente entender como fazer isso).

Transmitindo dados para o próximo controlador de visualização

A seguir, um exemplo baseado no vídeo. A idéia é passar uma string do campo de texto no First View Controller para o label no Second View Controller.

Crie o layout do storyboard no Construtor de interfaces. Para fazer o segue, basta Control clicar no botão e arrastar para o segundo controlador de visão.

Primeiro controlador de visão

O código para o First View Controller é

import UIKit

class FirstViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!

    // This function is called before the segue
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // get a reference to the second view controller
        let secondViewController = segue.destination as! SecondViewController

        // set a variable in the second view controller with the String to pass
        secondViewController.receivedString = textField.text!
    }

}

Controlador da segunda vista

E o código para o segundo controlador de visão é

import UIKit

class SecondViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    // This variable will hold the data being passed from the First View Controller
    var receivedString = ""

    override func viewDidLoad() {
        super.viewDidLoad()

        // Used the text from the First View Controller to set the label
        label.text = receivedString
    }

}

Não se esqueça

  • Ligue as tomadas para o UITextField e o UILabel .
  • Configure o primeiro e o segundo Controlador de Visualização para os arquivos Swift apropriados no IB.

Passando dados de volta para o View Controller anterior

Para passar dados do segundo controlador de exibição para o primeiro controlador de exibição, use um protocolo e um delegado . Este vídeo é muito claro apesar desse processo:

A seguir, um exemplo baseado no vídeo (com algumas modificações).

Crie o layout do storyboard no Construtor de interfaces. Mais uma vez, para fazer o segue, você apenas controla o arrastar do botão para o segundo controlador de visão. Defina o identificador segue para showSecondViewController . Além disso, não esqueça de conectar as tomadas e ações usando os nomes no código a seguir.

Primeiro controlador de visão

O código para o First View Controller é

import UIKit

class FirstViewController: UIViewController, DataEnteredDelegate {

    @IBOutlet weak var label: UILabel!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showSecondViewController" {
            let secondViewController = segue.destination as! SecondViewController
            secondViewController.delegate = self
        }
    }

    func userDidEnterInformation(info: String) {
        label.text = info
    }
}

Observe o uso de nosso protocolo DataEnteredDelegate personalizado.

Segundo Controlador e Protocolo de Visualização

O código para o segundo controlador de visualização é

import UIKit

// protocol used for sending data back
protocol DataEnteredDelegate: class {
    func userDidEnterInformation(info: String)
}

class SecondViewController: UIViewController {

    // making this a weak variable so that it won't create a strong reference cycle
    weak var delegate: DataEnteredDelegate? = nil

    @IBOutlet weak var textField: UITextField!

    @IBAction func sendTextBackButton(sender: AnyObject) {

        // call this method on whichever class implements our delegate protocol
        delegate?.userDidEnterInformation(info: textField.text!)

        // go back to the previous view controller
        _ = self.navigationController?.popViewController(animated: true)
    }
}

Note que o protocol está fora da classe View Controller.

É isso aí. Executando o aplicativo agora você deve ser capaz de enviar dados de volta do segundo controlador de visualização para o primeiro.

Sou novo no iOS e no Objective-C e em todo o paradigma do MVC e estou preso ao seguinte:

Eu tenho uma visão que atua como um formulário de entrada de dados e eu quero dar ao usuário a opção de selecionar vários produtos. Os produtos são listados em outra exibição com um UITableViewController e eu habilitei várias seleções.

Minha pergunta é: como faço para transferir os dados de uma vista para outra? Eu estarei segurando as seleções no UITableView em uma matriz, mas como passar isso de volta para a exibição de formulário de entrada de dados anterior para que ele possa ser salvo junto com os outros dados no Core Data no envio do formulário?

Eu já naveguei e vi algumas pessoas declararem um array no delegado do aplicativo. Eu li algo sobre Singletons, mas não entendo o que são e li algo sobre a criação de um modelo de dados.

Qual seria a maneira correta de realizar isso e como eu faria isso?


Depois de mais pesquisas, pareceu que Protocolos e Delegados é a maneira correta / preferida pela Apple de fazer isso.

Acabei usando este exemplo

Compartilhando dados entre controladores de visualização e outros objetos @ iPhone Dev SDK

Funcionou bem e permitiu que eu passasse uma string e uma matriz para frente e para trás entre minhas visualizações.

Obrigado por toda sua ajuda


Eu acho a versão mais simples e mais elegante com blocos que passam. Vamos nomear o controlador de visualização que aguarda os dados retornados como "A" e retornando o controlador de exibição como "B". Neste exemplo, queremos obter 2 valores: primeiro de Type1 e segundo de Type2.

Assumindo que usamos o Storyboard, o primeiro controlador define o bloco de retorno de chamada, por exemplo, durante a preparação do segue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.destinationViewController isKindOfClass:[BViewController class]])
    {
        BViewController *viewController = segue.destinationViewController;

        viewController.callback = ^(Type1 *value1, Type2 *value2) {
            // optionally, close B
            //[self.navigationController popViewControllerAnimated:YES];

            // let's do some action after with returned values
            action1(value1);
            action2(value2);
        };

    }
}

e o controlador de visualização "B" deve declarar a propriedade de retorno de chamada, BViewController.h:

// it is important to use "copy"
@property (copy) void(^callback)(Type1 *value1, Type2 *value2);

Do que no arquivo de implementação BViewController.m depois de ter valores desejados para retornar nosso retorno de chamada deve ser chamado:

if (self.callback)
    self.callback(value1, value2);

Uma coisa a lembrar é que o uso do bloco geralmente precisa gerenciar referências fortes e __baixo, como explicado here


Existem várias maneiras pelas quais os dados podem ser recebidos para uma classe diferente no iOS. Por exemplo -

  1. Inicialização direta após a alocação de outra classe.
  2. Delegação - para passar dados de volta
  3. Notificação - para transmitir dados para várias classes de uma só vez
  4. Salvando em NSUserDefaults - para acessá-lo mais tarde
  5. Aulas de singleton
  6. Bancos de dados e outros mecanismos de armazenamento, como plist, etc.

Mas para o simples cenário de passar um valor para uma classe diferente cuja alocação é feita na classe atual, o método mais comum e preferido seria a configuração direta de valores após a alocação. Isto se faz do seguinte modo:-

Podemos entendê-lo usando dois controladores - Controller1 e Controller2

Suponha que na classe Controller1 você queira criar o objeto Controller2 e empurrá-lo com um valor String sendo passado. Isso pode ser feito assim:

- (void)pushToController2 {

    Controller2 *obj = [[Controller2 alloc] initWithNib:@"Controller2" bundle:nil];
    [obj passValue:@"String"];
    [self pushViewController:obj animated:YES];
}

Na implementação da classe Controller2, haverá essa função

@interface Controller2  : NSObject

@property (nonatomic , strong) NSString* stringPassed;

@end

@implementation Controller2

@synthesize stringPassed = _stringPassed;

- (void) passValue:(NSString *)value {

    _stringPassed = value; //or self.stringPassed = value
}

@end

Você também pode definir diretamente as propriedades da classe Controller2 da mesma maneira como esta:

- (void)pushToController2 {

    Controller2 *obj = [[Controller2 alloc] initWithNib:@"Controller2" bundle:nil];
    [obj setStringPassed:@"String"];  
    [self pushViewController:obj animated:YES];
}

Para passar vários valores, você pode usar vários parâmetros como: -

Controller2 *obj = [[Controller2 alloc] initWithNib:@"Controller2" bundle:nil];
[obj passValue:@“String1 andValues:objArray withDate:date]; 

Ou se você precisar passar mais de 3 parâmetros relacionados a um recurso comum, você pode armazenar os valores em uma classe Model e passar esse modelObject para a próxima classe.

ModelClass *modelObject = [[ModelClass alloc] init]; 
modelObject.property1 = _property1;
modelObject.property2 = _property2;
modelObject.property3 = _property3;

Controller2 *obj = [[Controller2 alloc] initWithNib:@"Controller2" bundle:nil];
[obj passmodel: modelObject];

Então, se você quiser -

1) set the private variables of the second class initialise the values by calling a custom function and passing the values.
2) setProperties do it by directlyInitialising it using the setter method.
3) pass more that 3-4 values related to each other in some manner , then create a model class and set values to its object and pass the object using any of the above process.

Espero que isto ajude


O M em MVC é para "Modelo" e no paradigma MVC a função de classes de modelo é gerenciar os dados de um programa. Um modelo é o oposto de uma visão - uma visão sabe como exibir dados, mas não sabe nada sobre o que fazer com os dados, enquanto um modelo sabe tudo sobre como trabalhar com dados, mas nada sobre como exibi-los. Modelos podem ser complicados, mas não precisam ser - o modelo para seu aplicativo pode ser tão simples quanto uma matriz de strings ou dicionários.

O papel de um controlador é mediar entre a visão e o modelo. Portanto, eles precisam de uma referência a um ou mais objetos de visualização e um ou mais objetos de modelo. Digamos que seu modelo seja uma matriz de dicionários, com cada dicionário representando uma linha em sua tabela. A visualização raiz do seu aplicativo exibe essa tabela e pode ser responsável por carregar a matriz de um arquivo. Quando o usuário decide adicionar uma nova linha à tabela, ela toca em algum botão e seu controlador cria um novo dicionário (mutável) e o adiciona ao array. Para preencher a linha, o controlador cria um controlador de visualização de detalhes e fornece o novo dicionário. O controlador da visualização detalhada preenche o dicionário e retorna. O dicionário já faz parte do modelo, então nada mais precisa acontecer.


Passar dados do ViewController 2 (destino) para o viewController 1 (Source) é a coisa mais interessante. Supondo que você use storyBoard, essas são todas as formas que descobri:

  • Delegar
  • Notificação
  • Padrões do usuário
  • Solteirão

Aqueles foram discutidos aqui já.

Eu achei que existem mais maneiras:

-Usando retornos de chamada de bloco:

use-o no prepareForSeguemétodo no VC1

NextViewController *destinationVC = (NextViewController *) segue.destinationViewController;
[destinationVC setDidFinishUsingBlockCallback:^(NextViewController *destinationVC)
{
    self.blockLabel.text = destination.blockTextField.text;
}];

-Usando storyboards Desenrolar (Sair)

Implemente um método com um argumento UIStoryboardSegue no VC 1, como este:

-(IBAction)UnWindDone:(UIStoryboardSegue *)segue { }

Na história, conecte o botão "retornar" ao botão verde Sair (Desdobrar) do vc. Agora você tem um segue que "volta" para que você possa usar a propriedade destinationViewController no prepareForSegue do VC2 e alterar qualquer propriedade do VC1 antes de voltar.

  • Outra opção de usar storyboards Undwind (Exit) - você pode usar o método que você escreveu no VC1

    -(IBAction)UnWindDone:(UIStoryboardSegue *)segue {
        NextViewController *nextViewController = segue.sourceViewController;
        self.unwindLabel.text = nextViewController.unwindPropertyPass;
    } 

    E no prepareForSegue do VC1 você pode alterar qualquer propriedade que queira compartilhar.

Em ambas as opções de desenrolamento, você pode definir a propriedade tag do botão e verificá-la no prepareForSegue.

Espero que eu tenha adicionado algo à discussão.

:) Felicidades.


NewsViewController

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  [tbl_View deselectRowAtIndexPath:indexPath animated:YES];
  News *newsObj = [newstitleArr objectAtIndex:indexPath.row];
  NewsDetailViewController *newsDetailView = [[NewsDetailViewController alloc] initWithNibName:@"NewsDetailViewController" bundle:nil];

  newsDetailView.newsHeadlineStr = newsObj.newsHeadline;

  [self.navigationController pushViewController:newsDetailView animated:YES];
}

NewsDetailViewController.h

@interface NewsDetailViewController : UIViewController
@property(nonatomic,retain) NSString *newsHeadlineStr;
@end

NewsDetailViewController.m

@synthesize newsHeadlineStr;

Passando dados entre o FirstViewController para o SecondViewController como abaixo

Por exemplo:

FirstViewController Valor da cadeia como

StrFirstValue = @"first";

para que possamos passar esse valor na segunda classe usando a etapa abaixo

1> Precisamos criar o objeto string no arquivo SecondViewController.h

NSString *strValue;

2> precisa declarar propriedade como abaixo abaixo declaração no arquivo.

@property (strong, nonatomic)  NSString *strSecondValue;

3> precisa sintetizar esse valor no arquivo FirstViewController.m abaixo da declaração de cabeçalho

@synthesize strValue;

e em FirstViewController.h:

@property (strong, nonatomic)  NSString *strValue;

4> No FirstViewController, De qual método nós navegamos para a segunda visão, por favor escreva abaixo o código nesse método.

SecondViewController *secondView= [[SecondViewController alloc]     
initWithNibName:@"SecondViewController " bundle:[NSBundle MainBundle]];

[secondView setStrSecondValue:StrFirstValue];

[self.navigationController pushViewController:secondView animated:YES ];

Esta não é a maneira de fazer isso, você deve usar delegados, eu suponho que temos dois view controllers ViewController1 e ViewController2 e esta coisa check está no primeiro e quando seu estado muda, você quer fazer algo em ViewController2, para Conseguir isso da maneira correta, você deve fazer o seguinte:

Adicione um novo arquivo ao seu projeto (Protocolo Objective-C) File -> New, agora denomine ViewController1Delegate ou o que você quiser e escreva-o entre as diretivas @interface e @end

@optional

- (void)checkStateDidChange:(BOOL)checked;

Agora vá para ViewController2.h e adicione

#import "ViewController1Delegate.h"

então mude sua definição para

@interface ViewController2: UIViewController<ViewController1Delegate>

Agora vá para ViewController2.m e dentro da implementação adicione:

- (void)checkStateDidChange:(BOOL)checked {
     if (checked) {
           // Do whatever you want here
           NSLog(@"Checked");
     }
     else {
           // Also do whatever you want here
           NSLog(@"Not checked");
     }
}

Agora vá para ViewController1.he adicione a seguinte propriedade:

@property (weak, nonatomic) id<ViewController1Delegate> delegate; 

Agora, se você está criando o ViewController1 dentro do ViewController2 depois de algum evento, então você deve fazer isso usando arquivos NIB:

ViewController1* controller = [[NSBundle mainBundle] loadNibNamed:@"ViewController1" owner:self options:nil][0];
controller.delegate = self;
[self presentViewController:controller animated:YES completion:nil];

Agora está tudo pronto, sempre que você detectar o evento de verificação alterado em ViewController1, tudo o que você precisa fazer é o seguinte

[delegate checkStateDidChange:checked]; // You pass here YES or NO based on the check state of your control

Por favor, diga-me se há algo que não está claro se não entendi sua pergunta corretamente.


Eu gosto da idéia de objetos Model e objetos Mock baseados em NSProxy para confirmar ou descartar dados se o usuário seleciona pode ser cancelado.

É fácil passar dados em torno, pois é um objeto único ou um par de objetos e se você tem, digamos, o controlador UINavigationController, você pode manter a referência ao modelo interno e todos os controladores de visualização enviados podem acessá-lo diretamente do controlador de navegação.


Existem vários métodos para compartilhar dados.

  1. Você sempre pode compartilhar dados usando NSUserDefaults. Defina o valor que você deseja compartilhar com relação a uma chave de sua escolha e obtenha o valor NSUserDefaultassociado a essa chave no próximo controlador de visualização.

    [[NSUserDefaults standardUserDefaults] setValue:value forKey:key]
    [[NSUserDefaults standardUserDefaults] objectForKey:key]
  2. Você pode simplesmente criar uma propriedade em viewcontrollerA. Crie um objeto viewcontrollerAin viewcontrollerBe atribua o valor desejado a essa propriedade.

  3. Você também pode criar delegados personalizados para isso.


Há muitas respostas para essas perguntas oferecendo muitas maneiras diferentes de executar a comunicação do controlador de modo de exibição que realmente funcionaria, mas não vejo nenhum lugar mencionado sobre quais delas são realmente melhores de usar e quais evitar.

Na prática, na minha opinião, apenas algumas soluções são recomendadas:

  • Para passar dados adiante:
    • substituir o prepare(for:sender:)método de UIViewControllerquando usar um storyboard e segue
    • passar dados através de um inicializador ou através de propriedades ao executar transições do controlador de visualização através de código
  • Para passar dados para trás
    • atualizar o estado compartilhado do aplicativo (que você pode transmitir entre os controladores de exibição com um dos métodos acima)
    • usar delegação
    • use um desenrolar

Soluções que eu recomendo não usar:

  • Referenciando o controlador anterior diretamente em vez de usar delegação
  • Compartilhando dados por meio de um singleton
  • Passando dados pelo delegado do aplicativo
  • Compartilhando dados através dos padrões do usuário
  • Passando dados através de notificações

Essas soluções, apesar de trabalharem a curto prazo, introduzem muitas dependências que dificultarão a arquitetura do aplicativo e criarão mais problemas posteriormente.

Para os interessados, escrevi alguns artigos que abordam esses pontos com mais profundidade e destacam as várias desvantagens:


Se você quer passar dados do ViewControlerOne para o ViewControllerTwo, tente estes.

faça isso em ViewControlerOne.h

 @property (nonatomic, strong) NSString *str1;

faça isso em ViewControllerTwo.h

 @property (nonatomic, strong) NSString *str2;

Sintetize str2 em ViewControllerTwo.m

@interface ViewControllerTwo ()
@end
@implementation ViewControllerTwo
@synthesize str2;

faça isso em ViewControlerOne.m

 - (void)viewDidLoad
 {
   [super viewDidLoad];

  // Data or string you wants to pass in ViewControllerTwo..
  self.str1 = @"hello world";

 }

nos botões clique em evento fazer isso ..

-(IBAction)ButtonClicked
{ //Navigation on buttons click event from ViewControlerOne to ViewControlerTwo with transferring data or string..
  ViewControllerTwo *objViewTwo=[self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerTwo"];
  obj.str2=str1;
  [self.navigationController pushViewController: objViewTwo animated:YES];
}

faça isso em ViewControllerTwo.m

- (void)viewDidLoad
{
 [super viewDidLoad];
  NSLog(@"%@",str2);
}

Se você quiser enviar dados de um para outro viewController, aqui está um caminho para isso:

Digamos que temos viewControllers: ViewController e NewViewController.

em ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    IBOutlet UITextField *mytext1,*mytext2,*mytext3,*mytext4;
}

@property (nonatomic,retain) IBOutlet UITextField *mytext1,*mytext2,*mytext3,*mytext4;

-(IBAction)goToNextScreen:(id)sender;

@end

em ViewController.m

#import "ViewController.h"

#import "NewViewController.h"

@implementation ViewController
@synthesize mytext1,mytext2,mytext3,mytext4;

-(IBAction)goToNextScreen:(id)sender
{
    NSArray *arr = [NSArray arrayWithObjects:mytext1.text,mytext2.text,mytext3.text,mytext4.text, nil];


    NewViewController *newVc = [[NewViewController alloc] initWithNibName:@"NewViewController" bundle:nil];

    newVc.arrayList = arr;

    [self.navigationController pushViewController:newVc animated:YES];

}

Em NewViewController.h

#import <UIKit/UIKit.h>

@interface NewViewController : UITableViewController
{
    NSArray *arrayList;

    NSString *name,*age,*dob,*mobile;

}

@property(nonatomic, retain)NSArray *arrayList;

@end

Em NewViewController.m

#import "NewViewController.h"

#import "ViewController.h"

@implementation NewViewController
@synthesize arrayList;

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    // Return the number of rows in the section.
    return [arrayList count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];      
    }
    // Configure the cell...
    cell.textLabel.text = [arrayList objectAtIndex:indexPath.row];
    return cell;


}

@end

Assim, podemos passar os dados de um viewcontroller para outro controlador de visualização ...


Se você quiser passar dados de um controlador para outro, tente este código

FirstViewController.h

@property (nonatomic, retain) NSString *str;

SecondViewController.h

@property (nonatomic, retain) NSString *str1;

FirstViewController.m

- (void)viewDidLoad
   {
     // message for the second SecondViewController
     self.str = @"text message";

     [super viewDidLoad];
   }

-(IBAction)ButtonClicked
 {
   SecondViewController *secondViewController = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
   secondViewController.str1 = str;
  [self.navigationController pushViewController:secondViewController animated:YES];
 }

Crie a propriedade em next view controller .he defina getter e setter.

Adicione isto propertyem NextVC.h no nextVC

@property (strong, nonatomic) NSString *indexNumber;

Adicionar

@synthesize indexNumber; em NextVC.m

E por ultimo

NextVC *vc=[[NextVC alloc]init];

vc.indexNumber[email protected]"123";

[self.navigationController vc animated:YES];

Este é realmente um ótimo tutorial para qualquer um que queira um. Aqui está o código de exemplo:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"myIdentifer]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        myViewController *destViewController = segue.destinationViewController;
        destViewController.name = [object objectAtIndex:indexPath.row];
    }
}

Eu estava procurando esta solução por muito tempo, Atlast eu encontrei. Primeiro de tudo declarar todos os objetos em seu arquivo SecondViewController.h como

@interface SecondViewController: UIviewController 
{
    NSMutableArray *myAray;
    CustomObject *object;
}

Agora, no seu arquivo de implementação, aloque a memória para objetos como este

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
     if (self) 
     {
         // Custom initialization
         myAray=[[NSMutableArray alloc] init];
         object=[[CustomObject alloc] init];
     }
     return self;
}

Agora você alocou a memória para Arraye objeto. agora você pode preencher essa memória antes de empurrar issoViewController

Vá para o seu SecondViewController.he escreva dois métodos

-(void)setMyArray:(NSArray *)_myArray;
-(void)setMyObject:(CustomObject *)_myObject;

no arquivo de implementação você pode implementar a função

-(void)setMyArray:(NSArray *)_myArray
{
     [myArra addObjectsFromArray:_myArray];
}
-(void)setMyObject:(CustomObject *)_myObject
{
     [object setCustomObject:_myObject];
}

Esperando que o seu CustomObjectdeve ter uma função setter com ele.

agora seu trabalho básico está feito. ir para o lugar onde você quer empurrar oe SecondViewControllerfazer o seguinte material

SecondViewController *secondView= [[SecondViewController alloc] initWithNibName:@"SecondViewController " bundle:[NSBundle MainBundle]] ;
[secondView setMyArray:ArrayToPass];
[secondView setMyObject:objectToPass];
[self.navigationController pushViewController:secondView animated:YES ];

Tome cuidado para erros de ortografia.


Existem várias maneiras de fazer isso e é importante escolher o caminho certo. Provavelmente, uma das maiores decisões arquitetônicas está em como o código do modelo será compartilhado ou acessado em todo o aplicativo.

Eu escrevi um post sobre isso há algum tempo: Compartilhando o Código do Modelo . Aqui está um breve resumo:

Dados compartilhados

Uma abordagem é compartilhar ponteiros para os objetos de modelo entre os controladores de exibição.

  • Iteração de força bruta em controladores de exibição (em Navegação ou Tab Bar Controller) para definir os dados
  • Definir dados em prepareForSegue (se storyboards) ou init (se programático)

Já que preparar para segue é o mais comum aqui é um exemplo:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    var next = segue.destinationViewController as NextViewController
    next.dataSource = dataSource
}

Acesso independente

Outra abordagem é manipular uma tela cheia de dados por vez e, em vez de acoplar os controladores de exibição a cada par de cada controlador de exibição, a uma única fonte de dados que eles possam acessar de forma independente.

A maneira mais comum que vi isso é uma instância singleton . Então, se seu objeto singleton fosse DataAccessvocê poderia fazer o seguinte no método viewDidLoad do UIViewController:

func viewDidLoad() {
    super.viewDidLoad()
    var data = dataAccess.requestData()
}

Existem ferramentas adicionais que também ajudam a transmitir dados:

  • Observação de valor-chave
  • NSNotification
  • Dados principais
  • NSFetchedResultsController
  • Fonte de dados

Dados principais

O bom do Core Data é que ele tem relações inversas. Então, se você quiser apenas dar um NotesViewController ao objeto de notas, você pode, porque ele terá um relacionamento inverso com algo como o notebook. Se você precisar de dados no bloco de notas no NotesViewController, poderá percorrer o gráfico de objetos fazendo o seguinte:

let notebookName = note.notebook.name

Leia mais sobre isso na postagem do meu blog: Compartilhando código de modelo


No meu caso, usei uma classe singleton que pode funcionar como um objeto global, permitindo acessos aos dados de quase todos os lugares no aplicativo. A primeira coisa é construir uma classe singleton. Por favor, consulte a página, " Como deve ser o meu singleton Objective-C? " E o que eu fiz para tornar o objeto globalmente acessível foi simplesmente importá-lo no appName_Prefix.pchqual é para aplicar a declaração de importação em todas as classes. Para acessar este objeto e usar, eu simplesmente implementei o método de classe para retornar a instância compartilhada, que contém suas próprias variáveis





uiviewcontroller