Split view uisplitviewcontrollerpop over uipopovercontroller 1. Storyboard Framework The Storyboard defines the structure creating a SplitView projectmaster-detail application template for Pad,us E arc,use Storyboard template contains app Delegatebidmasterviewcontrollerbiddetailviewcontroller a split view Controller that contains all the Elements; splitviewcontroller as Stroyboard initial view Controller A Navigation Controller to handle What's happening on the left side of the split; there's a navigation controller a Master view Controller (displaying a master list of items) inside The navigation controller; navigation cont on the left Roller's Topviewcontroller is the master view controller a Detail View Controller on the right. right is also a navigation view Controller, which has a detail view controller uisplitviewcontroller @implementation bidappdelegate-(BOOL) Application: (UIApplication *) ApplicationdidfinishLaunchingwithoptions: (nsdictionary *) launchoptions{ //The following code is only used to set the Stroyboard, Unable to set the association between sense and sense objects
//Override point for customization after application launch. Uisplitviewcontroller *splitviewcontroller = (Uisplitviewcontroller *) self.window.rootviewcontroller; //has two navigationcontroller,left and right, and Right,detailviewcontrolleruinavigationcontroller is now available * Navigationcontroller = [splitviewcontroller.viewcontrollers lastobject]; //sets the Splitviewcontroller delegate, which is used to respond to the left view in the detail view controller to show the Hide//set delegate, which responds to the bottom screen, Popovercontroller display and disappearance splitviewcontroller.delegate = (id) Navigationcontroller.topviewcontroller; //navigationcontroller Top-level view controller return YES;
@end Why not set this delegate directly in Stroyboard? A complex storyboard is no normally loaded all at once. Since Interface Builder has no how to knowing which scenes would coexist, it actually forbids you frommaking any outlet or Target/action connections from a object in a scene to a object in Anotherscene. In fact, the only connections it allows that the sence from one scene to another is Segues.storyborad is not loaded together but is loaded on demand. Because of this, IB does not know which sence will exist at the same time, so it prohibits associating any outlet or target/action between objects of different sence. In fact, the only thing that can be associated between different sence is segue, so we have to manually connect the objects between the different sence in the code. The Master View Controller @class biddetailviewcontroller; @interface Bidmasterviewcontroller:uitableviewcontroller
@property (Strong, nonatomic) Biddetailviewcontroller *detailviewcontroller;
@end-(void) awakefromnib{
self.clearsselectiononviewwillappear = NO; Again, the Save cell is selected Self.contentsizeforviewinpopover = Cgsizemake (320.0, 600.0); [Super awakefromnib];
}-(void) viewdidload{
[Super viewdidload];//do no additional setup after loading the view, typically from a nib.self.navigationItem.left Barbuttonitem = Self.editbuttonitem; As I said before, each Viewcontroller has this button to flip the edit state
Self.navigationItem.rightBarButtonItem =
[[Uibarbuttonitem alloc] Initwithbarbuttonsystemitem:uibarbuttons Ystemitemadd
target:self
Action: @selector (Insertnewobject:)];
is not the delegate that was set up earlier? Self.detailviewcontroller = (Biddetailviewcontroller *) [[Self.splitViewController.viewControllers Lastobject] Topviewcontroller];
}
The Detail View Controller
@interface Biddetailviewcontroller ()
@property (Strong, Nonatomic) Uipopovercontroller *masterpopovercontroller;-(void) Configureview;
@end//creating A class extension lets you define some methods and properties that is going to be used//within your class But so you don ' t want to expose to other classes in a header file. Define private properties and methods using an extension with a name of NULL//If you just define an instance variable, you can @implementation the Biddetailviewcontroller#pragma mark-managing the detail directly in the {} item-(void) Setdetailitem: (ID) newdetailitem{
if (_detailitem! = Newdetailitem)//strong object, so you can directly compare the object address to distinguish whether it is the same {
_detailitem = Newdetailitem;
[self configureview];
}
if (self.masterpopovercontroller! = nil) {[Self.masterpopovercontroller dismisspopover animated:yes];// Vertical down, masterpopovercontroller non-empty, choose a different object, let PopOver immediately disappear}
}-(void) configureview{
if (self.detailitem) {self.detailDescriptionLabel.text = [self.detailitem description];}
}-(void) viewdidload{
[Super Viewdidload]; [Self configureview];
} #pragma the Mark-split View delegate method (iOS8 has killed this delegate method) It's called when the Split View controller is no longer going to show the Left side of the split view as a permanent fixture. This method is called when there is no longer a fixed display on the side. That is, when the ipad shifts from a horizontal screen to a vertical screen. -(void) Splitviewcontroller: (Uisplitviewcontroller *) Splitcontrollerwillhideviewcontroller: (UIViewController *) Viewcontroller//left View Controllerwithbarbuttonitem: (Uibarbuttonitem *) Barbuttonitemforpopovercontroller: ( Uipopovercontroller *) popovercontroller{
barbuttonitem.title = nslocalizedstring (@ "master", @ "master"); [Self.navigationitem Setleftbarbuttonitem:barbuttonitem Animated:yes];self.masterpopovercontroller = Popovercontroller;
To be coherent, splitviewcontroller will hide the left masterviewcontroller but through Barbuttonitem, you can activate Popovercontroller, To display the Masterviewcontroller//the user switches back to landscape orientation//from vertical, switch to horizontal screen, popover mechanism disappears, will be fixed display masterviewcontroller-(void) Splitviewcontroller: (Uisplitviewcontroller *) Splitcontrollerwillshowviewcontroller: (Uiviewcontroller *) Viewcontroller//left View Controllerinvalidatingbarbuttonitem: (Uibarbuttonitem *) Barbuttonitem//Make it invalid {
[self.navigationitem setleftbarbuttonitem:nil animated:yes];self.masterpopovercontroller = nil;
} @end Uiwebviewnsurl *url = [Nsurl URLWithString:self.detailItem]; Nsurlrequest *request = [Nsurlrequest Requestwithurl:url]; [Self.webview Loadrequest:request]; 2. Custom popovercreating Your Own Popover bidlanguagelistcontroller:uitableviewcontroller @interface Bidlanguagelistcontroller:uitableviewcontroller
@property (Weak, nonatomic) Biddetailviewcontroller *detailviewcontroller; @property (Strong, nonatomic) Nsarray * Languagenames; @property (Strong, nonatomic) Nsarray *languagecodes;
@end? -(void) viewdidload{
[Super Viewdidload];self.languagenames = @[@ "中文版", @ "French", @ "German", @ "Spanish"];self.languagecodes = @[@ " En ", @" fr ", @" de ", @" es "]; Self.clearsselectiononviewwillappear = NO; When the view is not displayed, check the size not empty//displayed in PopOver Self.contentsizeforviewinpopover = Cgsizemake (320.0, [self.languagecodes Count] * 44.0); [Self.tableview Registerclass:[uitableviewcell class] forcellreuseidentifier:@ "Cell"];
} #import <UIKit/UIKit.h> @interface Biddetailviewcontroller:uiviewcontroller < Uisplitviewcontrollerdelegate>
@property (strong, nonatomic) ID Detailitem; @property (weak, nonatomic) Iboutlet UILabel *detaildescriptionlabel;@p Roperty (Weak, nonatomic) Iboutlet UIWebView *webview; @property (Strong, nonatomic) Uibarbuttonitem *languagebutton; @property (Strong, nonatomic) Uipopovercontroller * Languagepopovercontroller; @property (copy, nonatomic) NSString *languagestring; -(ibaction) togglelanguagepopover;
@end-(void) Viewdidload{[super Viewdidload];self.languagebutton = [[Uibarbuttonitem alloc] initwithtitle:@ "Choose Language "Style:UIBarButtonItemStyleBorderedtarget:selfaction: @selector (togglelanguagepopover)]; Self.navigationItem.rightBarButtonItem = Self.languagebutton; [Self configureview];} -(Ibaction) togglelanguagepopover{
if (Self.languagepopovercontroller = = nil) {
Bidlanguagelistcontroller *languagelistcontroller = [[bidlanguagelistcontroller Alloc] init];
languagelistcontroller.detailviewcontroller = self;
Uipopovercontroller *poc = [[uipopovercontroller alloc]
& nbsp Initwithcontentviewcontroller:languagelistcontroll er];
[Poc presentpopoverfrombarbuttonitem:self.languagebutton
blockquote> &NBSP;&NBSP;PERMITTEDARROWDIREC Tions:uipopoverarrowdirectionany
& nbsp animated:yes];
self.languagepopovercontroller = POC;
} else {
if (self.languagepopovercontroller! = nil) {
[Self.languagepopovercontroller Dismisspopoveranimated:yes];
Self.languagepopovercontroller = nil;
}}
} Summary: 1. Masterdetail template, provides a framework to support splitview horizontal screen, master fixed on the left, through the TableView display data vertical screen, Master is hidden, However, you can display the details of the selected object in master by PopOver showing the right detail Note 1: In this template, from Splitviewcontroller to Navigationcontroller, To Masterviewcontroller, and then to detailviewcontroller each other, can be taken to each other's value App.window.rootViewController = = Splitviewcontrollersplitviewcontroller.viewcontrollers = = @[masternavigation, detailnavigation]; Masternavigation.topviewcontroller = = Masterviewcontrollerdetailnavigation.topviewcontroller = = Detailviewcontrollermasterviewcontroller and Detailviewcontroller, Also know their navigatormasterviewcontroller and detailviewcontroller, and know that the relationship between Splitviewcontrollercontroller is mutual, Only the differences between the strong and weak, such as in Mastercontroller, want to get to Detailcontroller, can do this: Detailviewcontroller = [[[ Self.splitviewcontroller Viewcontrollers] lastobject] topviewcontroller]; NOTE 2: A private member defines a data member, the following two ways are possible, because there is a pair of {}
@interface Hydmasterviewcontroller () {
Nsmutablearray *_objects; Private data members
//}
@end
@implementation Hydmasterviewcontroller
{
Nsmutablearray *_objects; Private data members
}
However, properties and methods cannot be defined within {}, so for properties and methods, it is only possible to use an empty extension for the definition of private.
@interface Hyddetailviewcontroller ()
@property (Strong, nonatomic) Uipopovercontroller *masterpopovercontroller;
-(void) Configureview;
@end
2. Custom PopOver is also simple: 1. Customize the Viewcontroller, and note the size of the popover in the self.contentsizeforviewinpopover = cgsizemake (320.0, [self.languagecodes Count] * 44.0) 2. Eject PopOver1 via a control) initialize ViewController2, Set PopOver display effect by method InitWithContentViewController3 Presentpopoverfrombarbuttonitem bidlanguagelistcontroller *languagelistcontroller = [[bidlanguagelistcontroller Alloc] Init]; uipopovercontroller *poc = [[uipopovercontroller alloc] &NBS P initwithcontentviewcontroller:la nguagelistcontroller]; [poc presentpopoverfrombarbuttonitem:self.languagebutton permittedarrowdirections: uipopoverarrowdirectionany &NBSP; animated:yes];
Lesson 11th: IPad Considerations