亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

純swift實現ipad版簡單美團界面功能

2020-03-09 17:43:20
字體:
來源:轉載
供稿:網友

本文實例為大家分享了swift實現ipad版美團界面功能的具體代碼,供大家參考,具體內容如下

一 總體功能圖一 : (ipad豎屏)

swift,ipad,美團界面

二 總體功能圖二 : (ipad橫屏)

swift,ipad,美團界面

三 講解內容

1 搭建美團界面(掌握)

2 ios8.0之后的Popover的運用(重點)

3 協議(掌握)

4 通知(掌握)

5 細節處理

四總體界面

1 由總體的app界面效果,能看出來,一個UIViewController控制器作為UINavigationController的根控制器就能滿足條件.

五 導航條設置

1 自定義導航條 : (系統的導航條不能滿足需求)

2 創建導航控制器類

swift,ipad,美團界面

3 獲取全局的導航條 : (用來作為設置)

//獲取導航條let navigationBar = UINavigationBar.appearanceWhenContainedInInstancesOfClasses([self.classForCoder])

 3.1 注意 :一定要用上面的方法來獲取,不要用下面的方法來獲取,因為通過下面方法獲取對導航條的設置,很有可能會造成導航條呈現黑色的情況.

UINavigationBar.appearance()

4 用圖片包裝導航條

//設置導航條的樣式navigationBar.setBackgroundImage(UIImage(named: "bg_navigationBar_normal"), forBarMetrics: .Default)

5 注意不要忘了將導航控制器的類型改為自定義類型,否則會加載不出來的

六 導航條相關內容處理

1 思路 : 通過觀察導航條中的按鈕,我們可以看出, 按鈕都是由圖片;主標題;子標題組成的,所以我們可以通過xib來描述,并且用一個UIView將按鈕包裹住,方便修改設置

2 創建繼承UIView的類,同時創建同類名的xib

swift,ipad,美團界面

3 xib圖

swift,ipad,美團界面

4 xib內部分布結構圖

swift,ipad,美團界面

5 如何在xib中分離圖片和標題之間的距離? 5.1 下圖解答

swift,ipad,美團界面

6 通過給xib拖線,拿到內部屬性

//按鈕頭像 @IBOutlet weak var iconButton: UIButton!//頭部子標題 @IBOutlet weak var subtitleLabel: UILabel!//頭部標題 @IBOutlet weak var title_Label: UILabel!

7 給xib中的屬性提供set方法和對應的get方法,方便外邊調用修改

//對頭部標題提供Set方法 var title : String? {  didSet{   return title_Label.text = title  } } //對頭部子標題提供set方法 var subtitle : String? {  didSet{   return subtitleLabel.text = subtitle  } } //對按鈕頭像提供set方法(平常的圖片) var normalName : String? {  didSet{   return iconButton.setImage(UIImage(named: normalName!), forState: .Normal)  } } //對按鈕頭像提供set方法(點擊后的圖片) var heightName : String? {  didSet{   return iconButton.setImage(UIImage(named: heightName!), forState: .Highlighted)  } } //對按鈕提供一個get方法 var getIconButton : UIButton {  get{   return iconButton  } }

8 提供一個加載xib的類方法,讓外界能通過該方法快速創建xib

//MARK: - 給類擴展一個方法(加載xib)extension XFJTopView { //提供一個快速創建xib的類方法 class func topView(title : String, subTitle : String, normalImageName : String, heightImageName : String) ->XFJTopView {  let topView = NSBundle.mainBundle().loadNibNamed("XFJTopView", owner: nil, options: nil).last! as! XFJTopView  //給屬性賦值  topView.title_Label.text = title  topView.subtitleLabel.text = subTitle  topView.iconButton.setImage(UIImage(named: normalImageName), forState: .Normal)  topView.iconButton.setImage(UIImage(named: heightImageName), forState: .Highlighted)  //返回通過xib創建的對象  return topView }}

9 添加頂部的按鈕

—-> 9.1 思路 : 通過添加到由導航條管理的item中的數組中來實現對加載xib的時候按鈕的添加

—-> 9.2 導航控制器的根控制器

swift,ipad,美團界面

—-> 9.3 XFJHomeViewController類對導航條中的item的管理(該部分代碼比較多,我們通過類擴展來實現)

//MARK: - 設置導航條中的itemextension XFJHomeViewController { @objc private func setUpTabBarItem() {  //設置值item的圖片(0)  let logoItem = UIBarButtonItem(image: UIImage(named: "icon_meituan_logo"), style: .Plain, target: nil, action: nil)  //對導航條最左邊的item賦值  navigationItem.leftBarButtonItem = logoItem  //取消導航條左邊的item點擊  logoItem.enabled = false  //設置其他的items(一)  let item1 = XFJTopView.topView("美團", subTitle: "全部分類", normalImageName: "icon_category_-1", heightImageName: "icon_category_highlighted_-1")  //設置第一個item  let topItem = UIBarButtonItem(customView: item1)  //對按鈕的監聽  item1.getIconButton.addTarget(self, action: "presentPopTopViewClick", forControlEvents: .TouchUpInside)  //賦值  self.topItem = topItem  //設置items(二)  let item2 = XFJTopView.topView("廣州", subTitle: "全部", normalImageName: "icon_district", heightImageName: "icon_district_highlighted")  let gzItem = UIBarButtonItem(customView: item2)  item2.getIconButton.addTarget(self, action: "presentPopGzViewClick", forControlEvents: .TouchUpInside)  //賦值  self.gzItem = gzItem  //設置items(三)  let item3 = XFJTopView.topView("排序", subTitle: "默認排序", normalImageName: "icon_sort", heightImageName: "icon_sort_highlighted")  let sortItem = UIBarButtonItem(customView: item3)  item3.getIconButton.addTarget(self, action: "presentPopSortViewClick", forControlEvents: .TouchUpInside)  //賦值  self.sortItem = sortItem  //將item添加到數組中  navigationItem.leftBarButtonItems = [logoItem,topItem,gzItem,sortItem] }}

七 Popover的彈出

1 分別創建三個類來管理彈出的Popover

swift,ipad,美團界面

2 對頂部三個item所彈出的控制做懶加載創建,保證用到的時候在創建

 

//MARK: - 懶加載控制器(一) private lazy var categoryVC : XFJCategoryViewController = {  //創建控制器  let categoryVC = XFJCategoryViewController()  //設置控制器的樣式  categoryVC.modalPresentationStyle = .Popover  //返回控制器  return categoryVC }() //MARK: - 懶加載控制器(二) private lazy var districtVC : XFJDistrictViewController = {  //創建控制器  let districtVC = XFJDistrictViewController()  //設置控制器的樣式  districtVC.modalPresentationStyle = .Popover  //返回控制器  return districtVC }() //MARK: - 懶加載控制器(三) private lazy var sortsVC : XFJSortsViewController = {  //創建控制器  let sortsVC = XFJSortsViewController()  //設置控制器的樣式  sortsVC.modalPresentationStyle = .Popover  //返回控制器  return sortsVC }()

3 根據彈出的Popover類型,我們也可以看出是由兩個UITableView組成,并且各占控制器的一半,那么我們這部分也可以通過xib來實現.

—-> 3.1 創建一個類來管理,同時創建xib

swift,ipad,美團界面

3.2 xib內部圖

swift,ipad,美團界面

4 彈出Popover(通過在9.3中對item的監聽)

—-> 4.1 彈出Popover代碼塊一 :

//MARK : - 實現監聽方法extension XFJHomeViewController { @objc private func presentPopTopViewClick() {  //彈出位置  categoryVC.popoverPresentationController?.barButtonItem = topItem  //設置背景顏色  categoryVC.popoverPresentationController?.backgroundColor = UIColor.clearColor()  //model出控制器  presentViewController(categoryVC, animated: true, completion: nil)  //取消UIBarButtonItem的交互  setDisabled()  //設置代理  categoryVC.popoverPresentationController?.delegate = self }}

—-> 4.1 彈出Popover代碼塊二:

extension XFJHomeViewController { @objc private func presentPopGzViewClick() {  //彈出位置  districtVC.popoverPresentationController?.barButtonItem = gzItem  //設置背景顏色  districtVC.popoverPresentationController?.backgroundColor = UIColor.clearColor()  //  //model出控制器  presentViewController(districtVC, animated: true, completion: nil)  //取消UIBarButtonItem的交互  setDisabled()  //設置代理  districtVC.popoverPresentationController?.delegate = self }}

—-> 4.1 彈出Popover代碼塊三 :

extension XFJHomeViewController { @objc private func presentPopSortViewClick() {  //彈出控制器的位置  sortsVC.popoverPresentationController?.barButtonItem = sortItem  //設置背景顏色  sortsVC.popoverPresentationController?.backgroundColor = UIColor.whiteColor()  //model出控制器  presentViewController(sortsVC, animated: true, completion: nil)  //取消UIBarButtonItem的交互  setDisabled()  //設置代理  sortsVC.popoverPresentationController?.delegate = self }}

八 處理彈出的Popover相關數據(全部由對應的模型來決定)

1 獲取xib中的對象并且提供一個快速創建xib的類方法

//左邊的tableView @IBOutlet weak var leftTableView: UITableView! //右邊的tableView @IBOutlet weak var rightTableView: UITableView! //模型分類數據 var categories : [XFJCategories]? //地區模塊的數據 var DistrictData : [XFJDistrict]? //定義一個屬性,用來記錄用戶點擊了左側的哪一行 var seletIndex : Int? //快速創建xib的類方法 class func lrTableView() ->XFJLRTableView {  return NSBundle.mainBundle().loadNibNamed("XFJLRTableView", owner: nil, options: nil).last as! XFJLRTableView } //分類的子數據 private var subData : [String]?

2 通過在xib中設置代理和數據源實現有關數據源方法

—-> 2.1 數據源方法一 : cell的個數

//MARK: - 數據源方法extension XFJLRTableView : UITableViewDataSource { //cell的個數 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {  //判斷是左邊還是右邊  if tableView == leftTableView { //左邊   return (delegateSource?.numberOfRowsInLeft(self))!  }else{ //右邊   return subData?.count ?? 0  } }

—-> 2.2 數據源方法二 : cell的內容

 

 //cell的內容 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {  //創建cell  var cell = UITableViewCell?()  //判斷  if tableView == leftTableView {   //創建自定義cell   cell = XFJLeftViewCell.leftViewCell(tableView)   //設置文字   cell?.textLabel?.text = delegateSource?.lrTableView(titleDataSource: indexPath.row)   //設置頭像(平常圖)--注意 :lrTableViewWithNormalImageInLeft千萬要注意大小寫   if delegate?.respondsToSelector("lrTableViewWithNormalImageInLeft:") == true {    cell?.imageView?.image = UIImage(named: (delegateSource?.lrTableView!(normalImageInLeft: indexPath.row))!)   }   //設置頭像(高亮圖)--注意 :lrTableViewWithHighlightImageLeft千萬要注意大小寫   if delegate?.respondsToSelector("lrTableViewWithHighlightImageLeft:") == true {    cell?.imageView?.highlightedImage = UIImage(named: (delegateSource?.lrTableView!(highlightImageLeft: indexPath.row))!)   }  }else{   cell = XFJRightViewCell.righViewCell(tableView)   //設置內容   cell?.textLabel?.text = subData![indexPath.row]  }  return cell! }

—-> 2.3 數據源方法三 : 點擊cell做出的相應數據改變

//MARK: - 點擊左邊的cellextension XFJLRTableView : UITableViewDelegate { func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {  //判斷是否是左邊  if tableView == leftTableView {//左邊   //獲取子數據   subData = delegateSource?.lrTableView(subDataSource: indexPath.row)   //調用協議方法(傳入用戶點擊的哪行)   delegate?.lrTableView(seletLeftButton: indexPath.row)   //記錄用戶點擊了左側的哪行   seletIndex = indexPath.row   //刷新表格   rightTableView.reloadData()  }else{ //右邊   //調用協議方法,傳入右側點擊了哪行和左側選中了哪行   delegate?.lrTableView(seletRightButton: indexPath.row, seletLeftButton: seletIndex!)  } }}

九 創建模型

1 導入plist文件

2 創建繼承NSObject的類,用來設置需要用到的模型屬性

swift,ipad,美團界面

-> 2.1 模型屬性一 :(分類中所需要的模型屬性)

 var highlighted_icon = String?() var icon = String?() var name = String?() var small_highlighted_icon = String?() var small_icon = String?() var map_icon = String?() var subcategories = [String]?()

—-> 2.2 模型屬性二 : (全部模塊中所需要的模型屬性)

 var name = String?() var subregions = [String]?()

—-> 2.3 模型屬性三 : (排序模塊中所需要的模型屬性)

 var label = String?() var value = Int?()

3 在各自管理的類中懶加載模型(采用MJ框架加載模型)

—-> 3.1 分類模塊中懶加載模型

//懶加載模型 private lazy var categories : [XFJCategories] = {  let categoriesData = XFJCategories.objectArrayWithFilename("categories.plist") as NSArray  //返回模型  return categoriesData as! [XFJCategories] }()

—-> 3.2 地區模塊中懶加載模型

 //懶加載 private lazy var DistrictView :[XFJDistrict] = {  let DistrictData = XFJDistrict.objectArrayWithFilename("gz.plist") as NSArray  //返回模型數據  return DistrictData as! [XFJDistrict] }()

—-> 3.3 排序模塊中懶加載模型

//創建一個屬性記錄按鈕的點擊狀態 var previousButton = UIButton() //懶加載 private lazy var sortsData : [XFJSorts] = {  //模型轉化  let sortsDatas = XFJSorts.objectArrayWithFilename("sorts.plist") as NSArray  //返回模型  return sortsDatas as! [XFJSorts] }()

十 自定義cell

1 通過功能圖知道Popover出來的控制器中cell中既展示圖片又展示文字,所以我們通過自定義cell來設置 2 自定義左邊的tableViewCell

swift,ipad,美團界面

class XFJLeftViewCell: UITableViewCell {  //左邊的tableView  class func leftViewCell(tableView : UITableView) ->XFJLeftViewCell {    //綁定cell類型    let leftCell = "leftCell"    var cell = tableView.dequeueReusableCellWithIdentifier(leftCell)    //判斷cell是否為空    if cell == nil {      cell = XFJLeftViewCell(style: .Default, reuseIdentifier: leftCell)    }    return cell as! XFJLeftViewCell  }  override init(style: UITableViewCellStyle, reuseIdentifier: String?) {    super.init(style: style, reuseIdentifier: reuseIdentifier)    //設置背景圖片    backgroundView = UIImageView(image: UIImage(named:"bg_dropdown_leftpart"))    selectedBackgroundView = UIImageView(image: UIImage(named:"bg_dropdown_left_selected"))  }  required init?(coder aDecoder: NSCoder) {    fatalError("init(coder:) has not been implemented")  }}

2.1 該方法是在數據源方法中調用的,用來加載cell

3 自定義右邊的tableViewCell

 

class XFJRightViewCell: UITableViewCell {  //右邊的tableView  class func righViewCell(tableView : UITableView) ->XFJRightViewCell {    //定義cell的標識    let rightCell = "rightCell"    //創建cell    var cell = tableView.dequeueReusableCellWithIdentifier(rightCell)    //判斷    if cell == nil {      cell = XFJRightViewCell(style: .Default, reuseIdentifier: rightCell)    }    //返回cell    return cell as! XFJRightViewCell  }  //設置cell的背景圖片  override init(style: UITableViewCellStyle, reuseIdentifier: String?) {    super.init(style: style, reuseIdentifier: reuseIdentifier)    backgroundView = UIImageView(image: UIImage(named: "bg_dropdown_rightpart"))    selectedBackgroundView = UIImageView(image: UIImage(named:"bg_dropdown_right_selected"))  }  required init?(coder aDecoder: NSCoder) {    fatalError("init(coder:) has not been implemented")  }}

十一 上半部分總結

1 用上面這些方法確實可以達到用戶點擊item,彈出對應的控制器.但是上面的代碼只是寫了對其中一個點擊item彈出的業邏輯,還有中間的item并沒與處理,如果采用這樣的方法處理,那么代碼量太多了,并且看起來也顯得沒什么技術含量,我們最終將不會采用這種方法實現.

十二 代理 協議(最終實現的方案)

1 需要實現的功能 : 通過代理協議的方式,實現用戶點擊彈出控制器的左邊部分,顯示出右邊部分,并且將對應的頭像和主標題,子標題顯示到item中

2 定義協議方法 : (包括可實現和可不實現)–> 因為 : 當點擊左邊的tableView中的cell的時候,有右邊有些內容是空的,所以如果都定義為必須實現的,會出現問題

3 定義在XFJLRTableView中的協議方法第一部分

///MARK : - 定義協議,用協議的方法來控制top中沒個按鈕的點擊,彈出控制器設置相應的內容@objc protocol XFJTableViewDataSource : NSObjectProtocol {  ///左邊的cell顯示的總行數(需要將左邊的tableView作為參數傳遞進去)  func numberOfRowsInLeft (leftTableView : XFJLRTableView) ->Int  ///左邊的cell顯示的數據  func lrTableView(titleDataSource leftRow: Int) ->String?  ///左邊的cell顯示的子數據  func lrTableView(subDataSource leftRow : Int) ->[String]  ///左邊的cell顯示的平常圖片(有些是不存在圖片的)  optional func lrTableView(normalImageInLeft leftRow : Int) ->String  ///左邊的cell顯示的高亮圖片(有些是不存在圖片的)  optional func lrTableView(highlightImageLeft leftRow : Int) ->String}

4 設置代理 :(分類模塊代理)

///設置代理(處理彈出的控制器)  weak var delegateSource : XFJTableViewDataSource?

5 注意 : 在對協議實現的部分方法中,已經在XFJLRTableView類中的數據源方法這種實現了或者是做出了判斷.(上面數據源方法中有介紹)

6 對分類用戶點擊后實現協議相關的方法

—-> 6.1 設置對應的控制器為代理

override func viewDidLoad() {    super.viewDidLoad()    //快速創建xib    let lrTableView = XFJLRTableView.lrTableView()    //設置尺寸    lrTableView.frame = view.bounds    //添加tableView    view.addSubview(lrTableView)    //設置代理(處理的是彈出控制器的部分)    lrTableView.delegateSource = self    //設置代理(處理的是用戶點擊cell的業務邏輯)    lrTableView.delegate = self  }

7 實現協議方法

///MARK : - 實現分類的代理方法(處理的是彈出控制器的部分)extension XFJCategoryViewController : XFJTableViewDataSource {  ///MARK : - 左側cell的行數  func numberOfRowsInLeft(leftTableView: XFJLRTableView) -> Int {    return categories.count  }  ///MARK : - 左側cell的標題  func lrTableView(titleDataSource leftRow: Int) -> String? {    //取出模型數據    let categorie = categories[leftRow]    return categorie.name  }  ///MARK : - 左側cell的子標題  func lrTableView(subDataSource leftRow: Int) -> [String] {    //取出模型數據    let categorie = categories[leftRow]    //判斷    return categorie.subcategories ?? []  }  ///MARK : - cell平常圖片  func lrTableView(normalImageInLeft leftRow: Int) -> String {    //取出模型數據    let categorie = categories[leftRow]    return categorie.small_icon!  }  ///MARK : - cell的高亮圖片  func lrTableView(highlightImageLeft leftRow: Int) -> String {    //取出模型數據    let categorie = categories[leftRow]    return categorie.small_highlighted_icon!  }}

8 處理用戶點擊item中的某行cell,將cell中顯示的圖片和主標題,子標題顯示在item中

—-> 8.1 定義協議 :

///MARK : - 定義協議,用來傳遞當用戶選擇了彈出的控制器中的某行,將cell中顯示的內容顯示到對應的top按鈕中@objc protocol XFJTableViewDelegate : NSObjectProtocol {  //點擊了左邊,告訴代理選擇了左邊的哪一行,只要告訴代理不需返回參數  func lrTableView(seletLeftButton leftRow : Int)  //點擊了右邊,高度代理點擊了右邊的哪一行,同時告訴代理選中了左邊的哪一行,不需要返回  func lrTableView(seletRightButton rightRow : Int,seletLeftButton leftRow : Int)}

—-> 8.2 設置代理 :

///設置代理(處理選中彈出的控制器中的哪一行)  weak var delegate : XFJTableViewDelegate?

—-> 8.3 實現協議中的方法

///MARK : - 實現分類的代理方法(處理的是用戶點擊cell的業務邏輯)extension XFJCategoryViewController : XFJTableViewDelegate {  //用戶點擊了左側,告訴代理點擊了左側的哪一行  func lrTableView(seletLeftButton leftRow: Int) {    //從模型中取出數據    let catrgoryData = categories[leftRow]    //判斷左側是否有子數據    let subCatroyData = catrgoryData.subcategories?.count    //如果沒有子數據,就將數據發送給外界,進行數據更改    if subCatroyData == 0 {      //通過通知的方式發送      NSNotificationCenter.defaultCenter().postNotificationName(XFJCategoryNotification, object: nil, userInfo: [XFJCategoryNotificationKey : catrgoryData])    }  }  //用戶點擊了右側,高度代理點擊了右側哪一行,同時告訴代理選中了左側哪一行  func lrTableView(seletRightButton rightRow: Int, seletLeftButton leftRow: Int) {    //從模型中獲取數據    let catrgoriesData = categories[leftRow]    //取出子數據    let subCatrgoriesData = catrgoriesData.subcategories![rightRow]    //發送通知    NSNotificationCenter.defaultCenter().postNotificationName(XFJCategoryNotification, object: nil, userInfo: [XFJCategoryNotificationKey : catrgoriesData, XFJSubCategoryNotificationKey : subCatrgoriesData])  }}

十三 通知

1 我們是如何將cell中對應的文字和圖片顯示到item中?

—-> 1.1 我們采用發送通知的方法將相關數據傳遞到item中

2 創建一個文件用來保存通知需要的參數

swift,ipad,美團界面

//分類let XFJCategoryNotification = "XFJCategoryNotification"let XFJCategoryNotificationKey = "XFJCategoryNotificationKey"let XFJSubCategoryNotificationKey = "XFJSubCategoryNotificationKey"//地區let XFJDistrictNotification = "XFJDistrictNotification"let XFJDistrictNotificationKey = "XFJDistrictNotificationKey"let XFJSubDistrictNotificationKey = "XFJSubDistrictNotificationKey"//排序let XFJSortsNotification = "XFJSortsNotification"let XFJSortsNotificationKey = "XFJSortsNotificationKey"

3 發送通知(分類模塊)—-> 通知書寫位置: 協議方法中

—-> 3.1 代碼塊一 :

//用戶點擊了左側,告訴代理點擊了左側的哪一行  func lrTableView(seletLeftButton leftRow: Int) {    //從模型中取出數據    let catrgoryData = categories[leftRow]    //判斷左側是否有子數據    let subCatroyData = catrgoryData.subcategories?.count    //如果沒有子數據,就將數據發送給外界,進行數據更改    if subCatroyData == 0 {      //通過通知的方式發送      NSNotificationCenter.defaultCenter().postNotificationName(XFJCategoryNotification, object: nil, userInfo: [XFJCategoryNotificationKey : catrgoryData])    }  }

—-> 3.2 代碼塊二 :

//用戶點擊了右側,高度代理點擊了右側哪一行,同時告訴代理選中了左側哪一行  func lrTableView(seletRightButton rightRow: Int, seletLeftButton leftRow: Int) {    //從模型中獲取數據    let catrgoriesData = categories[leftRow]    //取出子數據    let subCatrgoriesData = catrgoriesData.subcategories![rightRow]    //發送通知    NSNotificationCenter.defaultCenter().postNotificationName(XFJCategoryNotification, object: nil, userInfo: [XFJCategoryNotificationKey : catrgoriesData, XFJSubCategoryNotificationKey : subCatrgoriesData])  }

4 接收通知 : 雖然發送的通知是匿名通知,但是最好讓能將數據提供給誰的一方接收通知,這樣也方便設置相關數據

—-> 4.1 item是屬于XFJHomeViewController類的,就讓該類來接收通知,并實現通知中的方法

—-> 4.2 接收通知代碼 :

//接收分類通知    NSNotificationCenter.defaultCenter().addObserver(self, selector: "categoriesNotic:", name: XFJCategoryNotification, object: nil)    //接收地區通知    NSNotificationCenter.defaultCenter().addObserver(self, selector: "districtNotic:", name: XFJDistrictNotification, object: nil)    //接收排序通知    NSNotificationCenter.defaultCenter().addObserver(self, selector: "sortsNotic:", name: XFJSortsNotification, object: nil)

—-> 4.3 移除通知 (重要點)

//移除通知  deinit {    NSNotificationCenter.defaultCenter().removeObserver(self)  }

5 實現接收通知中的方法

—-> 5.2 分類

///MARK : - 實現接收分類通知的中調用的方法extension XFJHomeViewController {    @objc private func categoriesNotic(nic : NSNotification) {    //取出通知中的內容    let catrgoryData = nic.userInfo![XFJCategoryNotificationKey] as! XFJCategories    //此處(有可能沒有子數據,所以這里不需強轉)    let subCatroyData = nic.userInfo![XFJSubCategoryNotificationKey]    //設置數據(獲取頂部的view)    let categoryTopView = topItem?.customView as! XFJTopView    //子數據    let count = catrgoryData.subcategories?.count    //判斷    if count == 0 {      categoryTopView.title = "美團"      categoryTopView.subtitle = catrgoryData.name    }else{      categoryTopView.title = catrgoryData.name      categoryTopView.subtitle = subCatroyData as! String?    }    //設置圖標    categoryTopView.normalName = catrgoryData.icon    categoryTopView.heightName = catrgoryData.highlighted_icon    //退出poper     categoryVC.dismissViewControllerAnimated(true) { () -> Void in      //dismiss后允許交互      self.setEnabled()    }  }}

—-> 5.2 地區

///MARK : - 實現接收地區通知的中調用的方法extension XFJHomeViewController {  @objc private func districtNotic(disNic : NSNotification){  //取出通知中的內容  let districtData = disNic.userInfo![XFJDistrictNotificationKey] as! XFJDistrict  //此處(有可能沒有子數據,所以這里不需強轉)  let subDistrictData = disNic.userInfo![XFJSubDistrictNotificationKey]  //設置數據(獲取頂部的view)  let districtTopView = gzItem?.customView as! XFJTopView  //子數據  let count = districtData.subregions?.count  //判斷  if count == 0 {    districtTopView.title = "美團"    districtTopView.subtitle = districtData.name  }else{    districtTopView.title = districtData.name    districtTopView.subtitle = subDistrictData as! String?  }  //退出poper  districtVC.dismissViewControllerAnimated(true) { () -> Void in    //dismiss后允許交互    self.setEnabled()    }  }}

—-> 5.3 排序

///MARK : - 實現接收排序通知的中調用的方法extension XFJHomeViewController {  @objc private func sortsNotic(sortsNic :NSNotification){    //獲取通知中的內容    let sortsData = sortsNic.userInfo![XFJSortsNotificationKey] as! XFJSorts    //獲取頂部的view    let sortsView = sortItem?.customView as! XFJTopView    //設置數據    sortsView.subtitle = sortsData.label    //移除poper    sortsVC.dismissViewControllerAnimated(true) { () -> Void in      //dismiss后允許交互      self.setEnabled()    }  }}

十四 細節處理

1 我們發現當運行在橫屏的時候,沒有問題,但是當在運行的之后轉換為豎屏,導航條中item間的距離會被拉伸,這怎么解決呢?

—-> 1.1 產生這種現象的原因 : autoresizing導致屏幕旋轉的時候,子控件跟隨父控件的拉伸而拉伸

—-> 1.2 解決 :(如下圖)—> 將正方形中間的紅線去除就可以

swift,ipad,美團界面

2 當點擊某個item的時候,發現再點擊其他的item的時候,前一個item并沒有退出,這樣給用戶的體驗不好.我們通過代碼來設置.

—-> 2.1 在監聽用戶點擊的按鈕中讓所有的item都取消交互調用下面代碼

@objc private func setDisabled() {    topItem?.enabled = false    gzItem?.enabled = false    sortItem?.enabled = false  }

—-> 2.2 在實現接收通知中調用的方法中,在poper被dismiss的時候,允許用戶交互,調用下面代碼來允許交互

@objc private func setEnabled() {    topItem?.enabled = true    gzItem?.enabled = true    sortItem?.enabled = true  }

—-> 2.3 在實現對item按鈕的監聽方法中,我們設置poper的代理為當前控制器(這里只說明一段代碼,其它模塊也是一樣的)

 //設置代理    categoryVC.popoverPresentationController?.delegate = self

—-> 2.4 實現代理方法

///MARK: - 實現popver代理方法extension XFJHomeViewController : UIPopoverPresentationControllerDelegate {  func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {    //允許交互    setEnabled()  }}

十五 總結

1 這篇博客我寫的可能有點亂,代碼太多,我也沒辦法具體到某一點,只是說了大概,介紹了協議可以實現這種情況的方法,同時對通知的運用也是捎帶了,沒有怎么細說.希望你們盡量看吧,看不懂的話,在給我私信吧.能幫到大家的,我一定幫忙.

2 最后還是那句話,大家如果覺得我寫的博客還寫的話,麻煩大家多多關注我的官方博客,謝謝!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91av在线免费观看视频| 亚洲国产精彩中文乱码av在线播放| 69久久夜色精品国产69乱青草| 国产成人精品999| 日韩在线观看视频免费| 日韩女优在线播放| 久久久999精品免费| 欧美黑人巨大xxx极品| 日韩中文有码在线视频| 国产成人精品久久| 精品国产自在精品国产浪潮| 国产盗摄xxxx视频xxx69| 91影院在线免费观看视频| 日韩欧美成人精品| 久久99精品久久久久久噜噜| 色伦专区97中文字幕| 国产激情999| 亚洲欧美日韩国产成人| 欧美—级高清免费播放| 亚洲精品国产成人| 欧美大片免费观看| 欧美日韩视频免费播放| 97香蕉超级碰碰久久免费的优势| 欧美理论电影网| 亚洲精品mp4| 亚洲精品国产综合久久| 欧美激情亚洲视频| 最近更新的2019中文字幕| 欧美成人亚洲成人日韩成人| 国产欧美一区二区三区久久| 亚洲国产精品一区二区久| 欧美中文字幕视频在线观看| 国产一区二中文字幕在线看| 国产丝袜高跟一区| 911国产网站尤物在线观看| 欧美激情一区二区三区久久久| 国产成人福利视频| 亚洲在线免费视频| 精品自拍视频在线观看| 欧美精品一区在线播放| 日韩国产高清污视频在线观看| 免费av一区二区| 欧美激情在线观看视频| 日韩电影第一页| 亚洲男子天堂网| 欧美视频在线视频| 91精品国产综合久久香蕉最新版| 69精品小视频| 日本精品久久电影| 亚洲另类图片色| 久久久视频在线| 少妇精69xxtheporn| 亚洲欧洲日韩国产| 欧美在线视频一区| 欧美激情亚洲综合一区| 午夜精品久久久久久99热软件| 亚洲精品国产综合区久久久久久久| 国产欧美中文字幕| 欧美午夜片在线免费观看| 日韩中文字幕精品视频| 亚洲最大的免费| 国内精品久久久久久中文字幕| 国产精品久久久久久久久久小说| 久久精品视频网站| 亚洲影视中文字幕| 精品视频在线观看日韩| 亚洲无亚洲人成网站77777| 欧美精品aaa| 亚洲tv在线观看| 另类专区欧美制服同性| 日本韩国在线不卡| 久久久女女女女999久久| 在线观看不卡av| 日韩一区视频在线| 国产精品永久免费在线| 国产精品电影观看| 久久理论片午夜琪琪电影网| 91视频九色网站| 久色乳综合思思在线视频| 国产精品人成电影在线观看| 国产精品麻豆va在线播放| 国产成人aa精品一区在线播放| 疯狂欧美牲乱大交777| 91久久久久久久久久| 日韩有码在线播放| 美日韩精品视频免费看| 久久国产精彩视频| 亚洲最大的网站| 成人在线免费观看视视频| 亚洲精品福利视频| 国产精品日韩欧美大师| 国产精品美女久久| 欧美日韩国产成人在线观看| 亚洲女性裸体视频| 中文字幕亚洲欧美日韩高清| 欧美在线观看网站| 色悠久久久久综合先锋影音下载| 国产日韩在线看片| 日韩精品在线第一页| 亚洲专区在线视频| 亚洲人成伊人成综合网久久久| 少妇激情综合网| 日韩久久精品电影| 大伊人狠狠躁夜夜躁av一区| 中文字幕一区二区三区电影| 懂色av中文一区二区三区天美| 日韩av在线导航| 日韩中文娱乐网| 97精品一区二区视频在线观看| 久久精品成人一区二区三区| 久久久久国产精品免费| 北条麻妃在线一区二区| 久久久久国产精品www| 欧美理论片在线观看| 国产午夜精品久久久| 亚洲一区二区少妇| 国产精品日韩精品| 国产精品第一区| 欧美日韩国产丝袜另类| 亚洲色图美腿丝袜| 亚洲欧美激情四射在线日| 日韩电影免费观看在线| 日韩成人在线视频| 欧美激情二区三区| 久久的精品视频| 欧美性视频精品| 日韩中文字幕国产| 奇米成人av国产一区二区三区| 亚洲色图欧美制服丝袜另类第一页| 久久精品国产欧美亚洲人人爽| 911国产网站尤物在线观看| 亚洲精品乱码久久久久久按摩观| 国模视频一区二区三区| 亚洲网站视频福利| www.久久久久久.com| 亚洲va欧美va在线观看| 日韩精品在线免费| 97在线日本国产| 国产精品黄色影片导航在线观看| 免费99精品国产自在在线| 亚洲第一级黄色片| 在线播放日韩精品| 亚洲一区二区三区乱码aⅴ蜜桃女| 青青a在线精品免费观看| 国产成人福利视频| 国产一区玩具在线观看| 91国内在线视频| 欧美高清在线视频观看不卡| 欧美国产高跟鞋裸体秀xxxhd| 成人黄色网免费| 欧洲亚洲女同hd| 亚洲国产精久久久久久久| 成人久久久久爱| 亚洲男人的天堂网站| 国产精品成人久久久久| 日韩亚洲成人av在线| 亚洲欧美国产一区二区三区| 国产福利视频一区二区| 日韩精品中文字幕视频在线| 日韩成人在线观看| 久久久久国产精品www| 麻豆国产精品va在线观看不卡| 日日摸夜夜添一区| 97超级碰在线看视频免费在线看|