2016-06-21 8 views
-1

Ich habe zwei Klasseneine Schaltfläche aus BaseViewController Klasse Vererben Storyboard mit

  1. ViewController (Baseclass) 2. DerivedViewController (Abgeleitete Klasse)

ich eine Textbox in ViewController Klasse. Ist es möglich, dieses Textfeld in DerivedViewController Klasse über Vererbung zu verwenden?

Wenn ja, wie erhalte ich diese Textbox?

Ich versuchte folgenden Code für die Vererbung und ich erbte erfolgreich durch Importieren ViewController.h wie folgt.

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

@interface DerivedViewController : ViewController 

@end 

Nun mein Problem ist, wie man die textField in diesen DerivedViewController zu verwenden. Ich versuche, das Wiederverwendbarkeitskonzept der Vererbung zu erreichen. Da ich Storyboard verwende, ist es so verwirrend, wie man das textField bekommt und es in dieses ViewController-Feld im Storyboard legt.

Vielen Dank für die Zeit :)

ViewController.m

#import "ViewController.h" 

@interface ViewController() 
@property (weak, nonatomic) IBOutlet UITextField *firstTB; 
@property (weak, nonatomic) IBOutlet UITextField *secondTB; 
@property (weak, nonatomic) IBOutlet UILabel *symbolLabel; 
@property (weak, nonatomic) IBOutlet UITextField *find; 


@end 

@implementation ViewController 

int resultValue=0; 



- (IBAction)saveResult:(id)sender { 
    if((self.firstTB.text.length == 0) || self.secondTB.text.length == 0){ 
     [self showError]; 
     NSLog(@"Error"); 
    }else{ 
     int number1 = [[[self firstTB] text] intValue]; 
     int number2 = [[[self secondTB] text] intValue]; 
     resultValue=number1+number2; 
     NSLog(@"%d",resultValue); 
     [self saveData]; 
     [self removeShadow]; 
    } 

} 
- (IBAction)listResults:(id)sender { 
    // [self findData]; 
} 



//Save Data......... 

-(void) saveData{ 
    BOOL success = NO; 
    NSString *alertString = @"Data Insertion failed"; 
    success = [[DBManager getSharedInstance]saveData: 
       resultValue]; 


    if (success == NO) { 
     UIAlertView *alert = [[UIAlertView alloc]initWithTitle: 
           alertString message:nil 
                 delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
    } 
    if(success == YES){ 
     NSLog(@"FY %d",resultValue); 
    } 
} 

    //Find data....... 
-(void) findData { 

    int n = [[DBManager getSharedInstance]findResult:[[[self find] text] intValue]]; 
    if (n == 0) { 
     UIAlertView *alert = [[UIAlertView alloc]initWithTitle: 
           @"Data not found" message:nil delegate:nil cancelButtonTitle: 
           @"OK" otherButtonTitles:nil]; 
     [alert show]; 

    } 
    else{ 
     /* regNoTextField.text = findByRegisterNumberTextField.text; 
     nameTextField.text =[data objectAtIndex:0]; 
     departmentTextField.text = [data objectAtIndex:1]; 
     yearTextField.text =[data objectAtIndex:2]; */ 
     NSLog(@"Data Found %d",n); 

    } 
} 




// For Shadow..... 

-(void)showError{ 
    [self addShadow]; 
} 


-(void)addShadow{ 
    if(self.firstTB.text.length == 0 && self.secondTB.text.length == 0){ 

     [self glowfirstTB:YES]; 

     [self glowsecondTB:YES]; 

    }else if(self.firstTB.text.length == 0){ 

     [self glowfirstTB:YES]; 

     [self glowsecondTB:NO]; 

    }else if(self.secondTB.text.length == 0){ 

     [self glowsecondTB:YES]; 

     [self glowfirstTB:NO]; 
    } 


} 

-(void)removeShadow{ 
    [self glowfirstTB:NO]; 
    [self glowsecondTB:NO]; 
} 

-(void)glowfirstTB:(BOOL) shall_I_Glow{ 
    if(shall_I_Glow){ 
     self.firstTB.layer.masksToBounds = NO; 
     self.firstTB.layer.shadowColor = [[UIColor blueColor] CGColor]; 
     self.firstTB.layer.shadowOffset = CGSizeZero; 
     self.firstTB.layer.shadowRadius = 10.0f; 
     self.firstTB.layer.shadowOpacity = 1.0; 
    }else{ 
     self.firstTB.layer.shadowRadius = 0.0f; 
     self.firstTB.layer.shadowOpacity = 0.0; 
    } 
} 


-(void)glowsecondTB:(BOOL) shall_I_Glow{ 
    if(shall_I_Glow){ 
     self.secondTB.layer.masksToBounds = NO; 
     self.secondTB.layer.shadowColor = [[UIColor blueColor] CGColor]; 
     self.secondTB.layer.shadowOffset = CGSizeZero; 
     self.secondTB.layer.shadowRadius = 10.0f; 
     self.secondTB.layer.shadowOpacity = 1.0; 

     // [self.num setBorderStyle:UITextBorderStyleRoundedRect]; 
     // self.passwordTextField.layer.cornerRadius = 15.0; 
    }else{ 
     self.secondTB.layer.shadowRadius = 0.0f; 
     self.secondTB.layer.shadowOpacity = 0.0; 
    } 
} 


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

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

DerivedViewController.m (die als SearchPage.h hier genannt wird)

#import "SearchPage.h" 

@interface SearchPage() 

@property (weak, nonatomic) IBOutlet UITextField *searchText; 

@end 

@implementation SearchPage 

- (IBAction)findButton:(id)sender { 
    self.firstTB.text = @"hello"; 
    //Error message : Property 'firstTB' not found on object of type "SearchPage" 
} 


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

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

/* 
#pragma mark - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    // Get the new view controller using [segue destinationViewController]. 
    // Pass the selected object to the new view controller. 
} 
*/ 

@end 
+0

Wollen Sie nur die Textview zugreifen oder Sie wollen die gleiche Textview auf Viewcontrollers Bildschirm zeigen? –

+0

möchte die gleiche TextBox auf beiden Bildschirmen verwenden (beide ViewControllers) – Ganesh

+0

Wenn Sie dieselbe TextView auf beiden Basis und abgeleiteten ViewController zeigen möchten, müssen Sie TextView auf beiden ViewController von Storyboard hinzufügen und eine Unterklasse von UITextView erstellen und die gewünschten Eigenschaften festlegen Festlegen und Festlegen dieser Klasse als benutzerdefinierte Klasse der benutzerdefinierten ViewControlers TextViews-Klasse. Nur um Dinge zu löschen - Wenn Sie daran denken, TextView auf BaseViewControllern hinzuzufügen und das Gleiche in ChildViewController zu erben, wird TextView nicht automatisch angezeigt, Sie müssten textView auf beiden ViewControllern im Storyboard hinzufügen. –

Antwort

0

Was tun Sie möchten von diesem Textfeld wiederverwenden? Wenn Sie einfach nur den Textwert verwenden möchten, übergeben Sie ihn einfach als Parameter von BaseViewController an DerivedViewController. Andernfalls müssen Sie UITextField von der Unterklasse ableiten, um sie auf beiden View-Controllern zu verwenden.

+0

Nein. Ich möchte die Textbox nicht nur Inhalte des Textfelds verwenden. – Ganesh

1

ja, kann u das gleiche Textfeld in den ViewController in DerivedViewController hinzugefügt verwenden, für diese u einen weiteres textbox in der DerivedViewController's Szene hinzufügen und die IBOutlet-ViewController 'stextbox keine Notwendigkeit, schließen Sie einen neuen Absatzmarkt für textbox in den DerivedViewController zu erstellen Auf diese Weise können Sie die textbook erben.

Edit 1:

wenn u Unterklasse der ViewController alle Ausgangsanschlüsse in DerivedViewController Unterklasse zur Verfügung stehen. zum Beispiel in DerivedViewController nur ziehen Sie aus files owner zu Ihrer Ansicht Komponente wird es die Superview ist (Viewcontroller des) outlet Namen

bearbeitet 2 zeigen: u deklariert die privaten Eigenschaften, so dass es für andere Klassen zur Verfügung stellt auch in .h indem er erklärt, Datei,

ViewController.h

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

@interface DerivedViewController : ViewController 
@property (weak, nonatomic) IBOutlet UITextField *firstTB; 
@property (weak, nonatomic) IBOutlet UITextField *secondTB; 
@property (weak, nonatomic) IBOutlet UILabel *symbolLabel; 
@property (weak, nonatomic) IBOutlet UITextField *find; 
@end 

Viewcontroller.m

#import "ViewController.h" 

@interface ViewController() 
@end 

@implementation ViewController 

int resultValue=0; 

- (IBAction)saveResult:(id)sender { 
    //other codes 
} 

//other methods 
@end 
+0

Ihre Antwort macht Sinn. Du hast gesagt "Verbinde das IBOutlet mit dem ViewController 's Textfeld". Können Sie etwas mehr darüber erklären, wie Sie es implementieren? Wenn ich auf cmd klicke und ziehe, zeigt es keine Option wie Sie gesagt – Ganesh

+0

@Ganesh die Bearbeitung sehen –

Verwandte Themen