2012-05-08 4 views
0

Я знаю, что это всего лишь фундаментальный вопрос, но все же где-то я чего-то не хватает, я играю с передачей данных в textView из другого класса. Для этого я создал два класса: один с xib-файлом (ViewController) и другой без (secondVC).Передача данных в textView из другого класса

Что я пытаюсь сделать, так это то, что у меня есть текстовое представление в классе ViewController и вы хотите передать данные этому текстуру из secondVC. Вот как я это делаю.

//ViewController.h 

#import <UIKit/UIKit.h> 
#import "secondVC.h" 

@interface ViewController : UIViewController{ 

    IBOutlet UITextView *textView; 
} 

@property (nonatomic, retain) UITextView *textView; 

- (IBAction)go:(id)sender; 

@end 


//ViewController.m 

- (IBAction)go:(id)sender{ 

    secondVC *sec = [[secondVC alloc] init]; 

    [sec print]; 

} 


//secondVC.h 

#import <UIKit/UIKit.h> 
#import "ViewController.h" 

@interface secondVC : UIViewController 

- (void)print; 

@end 


//secondVC.m 

- (void)print{ 

    NSString *printThis = @"This works"; 

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

    [vc.textView setText:printThis]; 

    //vc.textView.text = printThis //Tried both 
} 

Любые предложения будут оценены.

Благодаря

+0

Это не имеет ничего общего с Xcode. –

ответ

0

вы можете сделать так:

//ViewController.h

#import <UIKit/UIKit.h> 
#import "secondVC.h" 

@interface ViewController : UIViewController{ 

    IBOutlet UITextView *textView; 
} 

@property (nonatomic, retain) UITextView *textView; 

- (IBAction)go:(id)sender; 

@end 


//ViewController.m 

- (IBAction)go:(id)sender{ 

    secondVC *sec = [[secondVC alloc] init]; 
    sec.viewController = self; 
    [sec print]; 

} 


//secondVC.h 

#import <UIKit/UIKit.h> 
#import "ViewController.h" 

@interface secondVC : UIViewController { 
ViewController *viewController; 

} 

@property(nonatomic, retain)ViewController *viewController; 

- (void)print; 

@end 


//secondVC.m 

@synthesize viewController; 

- (void)print{ 

    NSString *printThis = @"This works"; 
    self.viewController.textView.text = printThis ; 
} 
+0

привет, спасибо за ваш код, но Im получает сообщение об ошибке «Неизвестный тип имя viewController» в secondVC.h на ViewController * ViewController; Любая идея? – 125369

+0

спасибо, чувак, ваш код работает. Я также решил проблему с именем типа ViewController. – 125369

0

Try с протоколом ... если вы хотите, чтобы отправить строку из TextView (ребенок) к другому ViewController (родительский)

+0

можно получить пример кода – 125369

0

Вам нужен метод делегата, который стрелял из SecondVC и обрабатывается в первый (ViewController).

0

.h файл:

#import <UIKit/UIKit.h> 


@protocol StringDelegate <NSObject> 

-(void)getArrayOfStrings:(NSMutableArray*)strArray; 


@end 



@interface WWSettings : UIViewController{ 


} 

@property(nonatomic,assign)id<StringDelegate>delegate; 

@end 

.m файл:

#import "WWSettings.h" 

@implementation WWSettings 
@synthesize delegate; 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

-(void)blablablaFunction{ 
    [delegate getArrayOfStrings:yourArray]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 
@end 

, если вы не понимаете, как это работает .. спрашивайте! я сделаю все возможное, чтобы помочь вам)

ваш secondVC

#import <UIKit/UIKit.h> 
#import "WWSettings.h" 
@interface secondVC : UIViewController<StringDelegate>{ 


    WWSettings  *obj; 



} 

@end 

и .m файл:

#import "secondVC.h" 


@implementation secondVC 

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




-(void)getArrayOfStrings:(NSMutableArray *)strArray{ 



    // here you get your array !!! it's a delegate function made by you in child viewController; 



} 

- (void)viewDidLoad 
{ 
    obj = [[WWSettings alloc]init]; 
    [obj setDelegate:self]; 



    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
} 
+0

спасибо за ваш пример кода, но все же мне кажется несколько неясным. Можно ли привести пример к тому, что я искал, тогда было бы более понятно, спасибо за ваше время – 125369

0

Есть несколько вопросов здесь:

  1. You У меня есть ViewController, создавая новый secondVC и отправляя сообщение print. Это нормально, но реализация -print создает другой экземпляр ViewController и пытается установить текст его textView. Это явно не то, что вы хотите - вместо этого вы должны отправить текст обратно в исходный экземпляр ViewController.

  2. Это второй случай ViewController весьма вероятно, имеет textView набор свойств к нулю, так как textView это отдушина, но вы не загрузили его вид с .xib.

  3. Это действительно Неприятно для одного контроллера представления, чтобы возиться с представлениями другого контроллера вида. secondVC должен указывать текст на исходный объект ViewController, не пытаясь установить текст одного из его представлений.

  4. Для облегчения взаимодействия с secondVC в ViewController, дать secondVC свойство следить оригинального ViewController. Обычно здесь нужно определить протокол делегатов для secondVC и реализовать этот протокол в ViewController. Когда ViewController создает secondVC, он устанавливает для себя делегат secondVC.Это дает secondVC указатель на его делегат (его не должно волновать его ViewController или какой-либо другой объект, если делегат реализует правильные методы).

0

первый VC .h файл:

#import <UIKit/UIKit.h> 

@protocol textViewChildDelegate <NSObject> 

-(void)getStrings:(NSString*)string; 

@end 
@interface textViewChild : UIViewController<UITextViewDelegate>{ 

    UITextView  *textView; 

} 
@property(nonatomic,assign)id<textViewChildDelegate>delegate; 
@end 

.m файл:

#import "textViewChild.h" 



    @implementation textViewChild 
    @synthesize delegate; 
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
    { 
     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
     if (self) { 
      // Custom initialization 
     } 
     return self; 
    } 



    -(void)myWorkingMethod{ 


     // get string from textView 
     [delegate getStrings:textView.text]; 


    } 

    - (void)viewDidLoad 
    { 

     textView = [[UITextView alloc]initWithFrame:CGRectMake(0, 240, 320, 240)]; 

     [super viewDidLoad]; 
     // Do any additional setup after loading the view. 
    } 

Теперь переходим к secondVC .h:

#import <UIKit/UIKit.h> 
#import "textViewChild.h" 
@interface TextViewViewController : UIViewController<textViewChildDelegate>{ 

    UITextView * myfirstTextView; 


} 

@end 

и .m файл:

#import "TextViewViewController.h" 

@implementation TextViewViewController 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 


-(void)getStrings:(NSString *)string{ 


    myfirstTextView.text = string; // finally we get string from child view controller 

} 

- (void)viewDidUnload 
{ 

    myfirstTextView = [[UITextView alloc]init]; 


    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 
Смежные вопросы