wake-up-neo.com

füge UIViewController in der Unteransicht hinzu

Ich weiß nicht, ob dies der richtige Schlüssel ist, um nach "UIViewController in Untersicht hinzufügen" zu suchen . Was Sie in meinem Bild sehen können, sind zwei ViewController, der Hauptcontroller und der zweite Controller. Im Hauptcontroller befindet sich eine UIView (blaue Hintergrundfarbe). In UIView möchte ich den zweiten ViewController in meine UIView einfügen. Ich habe diesen Code, aber es hat nicht funktioniert. 

enter image description here

hier ist mein code

#import "ViewController.h"
#import "SampleViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *testView;

@end

@implementation ViewController

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

    SampleViewController * sample = [[SampleViewController alloc] initWithNibName:@"SampleViewController" bundle:nil];
    sample.view.frame = CGRectMake(0, 0, self.testView.bounds.size.width, self.testView.bounds.size.height);
    [self.testView addSubview:sample.view];
} 

@end

Ich möchte wissen, ob das möglich ist? Ich weiß, dass initWithNibName: in der xib-Datei arbeitet. Ich kann nicht genau den Begriff für die Suche in Google finden. Ich versuche nur etwas zu experimentieren, wenn dies in IOS möglich ist. Ich hoffe, du verstehst, was ich versuche. Ich hoffe auf deinen Rat. Danke im Voraus

hier ist mein Update

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *testView;
@property(strong,nonatomic) SampleViewController * samples;
@end

@implementation ViewController

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

UIStoryboard *storyBoard = self.storyboard;
SampleViewController * sample = [storyBoard instantiateViewControllerWithIdentifier:@"SampleViewController"]; 
// SampleViewController * sample = [[SampleViewController alloc] //initWithNibName:@"SampleViewController" bundle:nil];

[self displayContentController:sample];
//commented the below line because it is not needed here, use it when you want to remove        
//child view from parent.
 //[self hideContentController:sample];

}

- (void) displayContentController: (UIViewController*) content;
{
    [self addChildViewController:content];                 // 1
    content.view.bounds = self.testView.bounds;                 //2
    [self.testView addSubview:content.view];
    [content didMoveToParentViewController:self];          // 3
}


- (void) hideContentController: (UIViewController*) content
{
    [content willMoveToParentViewController:nil];  // 1
    [content.view removeFromSuperview];            // 2
    [content removeFromParentViewController];      // 3
}

Ich bekomme immer diesen Fehler 

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/ace/Library/Developer/CoreSimulator/Devices/035D6DD6-B6A5-4213-9FCA-ECE06ED837EC/data/Containers/Bundle/Application/EB07DD14-A6FF-4CF5-A369-45D6DBD7C0ED/Addsubviewcontroller.app> (loaded)' with name 'SampleViewController''

Ich denke, es ist auf der Suche nach einer Feder. Ich habe hier keine Feder eingeführt.

12
user3818576

Sie sollten das Child-Containment-Konzept verwenden. Hier ist MainViewController ein übergeordneter View-Controller, und Sie möchten die Child-View-Controller-Ansicht als Unteransicht auf dem Main View-Controller hinzufügen. 

Hinzufügen und Entfernen eines untergeordneten Objekts

//call displayContentController to add SampleViewCOntroller view to mainViewcontroller
 [self displayContentController:sampleVCObject];

// write this method in MainViewController
- (void) displayContentController: (UIViewController*) content;
{
   [self addChildViewController:content];                 // 1
   content.view.bounds = testView.bounds;                 //2
   [testView addSubview:content.view];
   [content didMoveToParentViewController:self];          // 3
}

So funktioniert der Code:

Es ruft die addChildViewController: -Methode des Containers auf, um das untergeordnete Element hinzuzufügen. Beim Aufrufen der addChildViewController: -Methode wird auch die willMoveToParentViewController: -Methode des untergeordneten Objekts automatisch aufgerufen. Sie greift auf die view -Eigenschaft des untergeordneten Objekts zu, um die Ansicht abzurufen, und fügt sie der eigenen Ansichtshierarchie hinzu. Der Container legt die Größe und Position des Kindes fest, bevor die Ansicht hinzugefügt wird. Container wählen immer, wo der Inhalt des Kindes angezeigt wird. Obwohl in diesem Beispiel der Rahmen explizit festgelegt wird, können Sie die Position der Ansicht auch mithilfe von Layouteinschränkungen festlegen. Die Methode didMoveToParentViewController: wird explizit aufgerufen, um zu signalisieren, dass der Vorgang abgeschlossen ist.

//you can also write this method in MainViewController to remove the child VC you added before.
- (void) hideContentController: (UIViewController*) content
{
   [content willMoveToParentViewController:nil];  // 1
   [content.view removeFromSuperview];            // 2
   [content removeFromParentViewController];      // 3
}

Weitere Informationen finden Sie im Apple-Dokument: https://developer.Apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html

Konfigurieren eines Containers im Interface Builder für alle, die keinen Code schreiben möchten.

Um eine Parent-Child-Container-Beziehung zur Entwurfszeit zu erstellen, fügen Sie Ihrer Storyboard-Szene ein Container-Ansichtsobjekt hinzu (siehe Abbildung 5-3). Ein Container-Ansichtsobjekt ist ein Platzhalterobjekt, das den Inhalt eines untergeordneten Ansichtscontrollers darstellt. Verwenden Sie diese Ansicht, um die Stammansicht des untergeordneten Elements im Verhältnis zu den anderen Ansichten im Container zu positionieren.

 Adding a container view in Interface Builder Wenn Sie einen Ansichtscontroller mit einer oder mehreren Containeransichten laden, lädt Interface Builder auch die diesen Ansichten zugeordneten untergeordneten Ansichtscontroller. Die untergeordneten Elemente müssen gleichzeitig mit dem übergeordneten Element instanziiert werden, damit die entsprechenden übergeordneten und untergeordneten Beziehungen erstellt werden können.

42
Sandeep Ahuja

Sie können dies einfach mit StoryBoards tun

  • Öffnen Sie Storyboards, und wählen Sie den Ansichts-Controller aus, in dem sich Ihre blaue Ansicht befindet. Öffnen Sie die Hilfsprogramme, suchen Sie nach ContainerView und ziehen Sie ihn in Ihre blaue Ansicht. Dadurch wird automatisch ein Ansichts-Controller hinzugefügt, der als untergeordnete Ansicht für Ihre Ansicht fungiert. Sie können die Größe der Containeransicht im Größeninspektor ändern.

enter image description here

13
raki

Ich habe das Problem mit der Uiview auf dem zweiten Uiviewcontroller gelöst ..__ Folgen Sie dem Code, den ich verwendet habe:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
SecondViewController *sb = (SecondViewController *)[storyboard instantiateViewControllerWithIdentifier:@"sb"];

sb.view.backgroundColor = [UIColor redColor];    
[sb willMoveToParentViewController:self];

[self.view addSubview:sb.view];

[self addChildViewController:sb];
[sb didMoveToParentViewController:self];

Ich hoffe Dir zu helfen.

Danke vielmals

6
user3576455

Sie können UIViewController seit iOS5 ... einen childViewController hinzufügen ... es ist eine großartige Möglichkeit, kleinere, wiederverwendbare ViewController zu erstellen, die ich auch sehr mag.

sie sind wirklich nah dran, aber Sie brauchen nur ein paar Zeilen mehr Code.

///
 [self addChildViewController:sample];

 [self.testView addSubview:sample.view]; //you already have this..

 [sample didMoveToParentViewController:self]; 

In viewWillDisappear: oder einer der anderen Abreißmethoden, die Sie wie folgt bereinigen müssen:

//we'll need another pointer to sample, make it an iVar / property..
   [sample willMoveToParentViewController:nil];  // 1
   [sample removeFromSuperview];            // 2
   [sample removeFromParentViewController];      // 3

Sie können die Apple-Dokumente mit den untergeordneten viewControllers hier lesen. https://developer.Apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

3
Jef

Ich versuche, UIViewController in der Unteransicht hinzuzufügen, und diese Arbeit ... __ Auf UIViewController habe ich die Schaltfläche 2 in der .h-Datei hinzugefügt:

-(IBAction)matchButtonAction:(id)sender;
-(IBAction)closeButtonAction:(id)sender;

Und in .m Datei:

-(IBAction)matchButtonAction:(id)sender
{
    NSLog(@"matchButtonAction");
}
-(IBAction)closeButtonAction:(id)sender
{
    NSLog(@"closeButtonAction");
}

aber ich sehe das Protokoll nicht. 

Ich muss denselben Parameter auf UIViewController instantiateViewControllerWithIdentifier hinzufügen?

Wie löse ich das Problem?

Meine UIViewController-Initialisierung lautet:

AlertDialogViewController *alertDialogView = (AlertDialogViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"alertDialogView"];         
        [alertDialogView willMoveToParentViewController:self];
        [viewController.view addSubview:alertDialogView.view];
        [viewController addChildViewController:alertDialogView];
        [alertDialogView didMoveToParentViewController:viewController];
2
user3576455
SampleViewController * sample = [[SampleViewController alloc] initWithNibName:@"SampleViewController" bundle:nil];
sample.view.frame = CGRectMake(0, 0, self.testView.bounds.size.width, self.testView.bounds.size.height);

[self addChildViewController:sample];
[self.testView addSubview:sample.view];
2
Zigii Wong

Da sich Ihr View Controller im Storyboard befindet, sollten Sie instantiateViewControllerWithIdentifier verwenden, um VC vom Storyboard zu erhalten.

SampleViewController * sample = [self.storyboard instantiateViewControllerWithIdentifier:@"IdOfSampleViewController"];
sample.view.frame = CGRectMake(0, 0, self.testView.bounds.size.width, self.testView.bounds.size.height);
[self.testView addSubview:sample.view];

Vergessen Sie nicht, das Identifier für die SampleViewController im Storyboard hinzuzufügen

1
Anil Varghese

Ich habe versucht, diesen Code zu verwenden:

SecondViewController * secondViewController = [[SecondViewController-Zuordnung] initWithNibName: nil Bundle: nil];

 secondViewController.view.frame = CGRectMake(0, 0, self.mySubView.bounds.size.width, self.mySubView.bounds.size.height);

 [self addChildViewController:secondViewController];
 [self.viewDialogSolution addSubview:secondViewController.view];

aber ich sehe nur myview nicht das layout von secondViewController.

Ho, um das Problem zu lösen?

Danke vielmals

0
user3576455