2015-07-29 3 views
1

Я изучаю, как использовать PageViewController и в приложении, которое я создаю. Мне нужно обновить содержимое на экране из содержащего ViewController.PageViewController и обновление экрана/данных

Так что в моей раскадровке у меня есть:

контроллер вида, класс RoomPageListViewController.

контроллер вида, класс RoomContentViewController, который имеет несколько меток, которые обновляются с использованием CoreData.

PageViewController

Установка очень проста, я могу положить в весь код, если это необходимо, но то, что я хотел сделать, это от RoomPageListViewController, чтобы иметь возможность вызвать функцию в RoomContentViewController обновить этикетки и сохранить пользователя на странице, что они есть.

Все, что я пытался привел к ошибке, например, попробовал:

let pageContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("RoomContentViewController") as! RoomContentViewController 
pageContentViewController.updateScreen() 

Но не повезло ... как я могу сделать это, или я делаю это «неправильный» путь?

Спасибо!

EDIT v3: теперь реализация протокола полностью выполнена!

Это код RoomPageListViewController:

class RoomPageListViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate { 

    var roomContentVCAccess: RoomContentVCAccess! 

    var roomsList: Array<String> = ["Entire Home"] 
    var roomButtonClicked: String = "" 
    let activityInd: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge) 
    var showInd: Bool = true 
    let shadowLabel: UILabel = UILabel(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height)) 
    var viewBySelection: Int = 1 
    var roomDeviceGroupID: Int = 0 
    var redrawBool: Bool = true 
    var displayRoom: String = "" 

    var pageViewController : UIPageViewController! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.navigationItem.title = "Devices By Room" 

     var backBtn : UIBarButtonItem = UIBarButtonItem(title: " ", style: UIBarButtonItemStyle.Plain, target: self, action: nil) 
     self.navigationItem.leftBarButtonItem = backBtn 
     self.navigationItem.leftBarButtonItem?.enabled = false 

     var settingsBtn : UIBarButtonItem = UIBarButtonItem(title: "Settings", style: UIBarButtonItemStyle.Plain, target: self, action: "goSettings") 
     self.navigationItem.rightBarButtonItem = settingsBtn 

     activityInd.stopAnimating() 

     if showInd == true { 
      startInd() 
     } 

    } 


    func startInd() { 
     shadowLabel.backgroundColor = UIColor.lightGrayColor() 
     shadowLabel.text = "Please Wait... Loading Data...\n\n\n\n\n" 
     shadowLabel.numberOfLines = 6 
     shadowLabel.textAlignment = NSTextAlignment.Center 

     let screenSize: CGRect = UIScreen.mainScreen().bounds 
     shadowLabel.center = CGPoint (x: screenSize.width/2 , y: screenSize.height/2) 
     shadowLabel.alpha = 0.5 
     shadowLabel.hidden = false 

     activityInd.center = CGPoint (x: screenSize.width/2 , y: screenSize.height/2) 
     activityInd.color = UIColor.blueColor() 
     activityInd.startAnimating() 
     activityInd.hidden = false 

     self.view.addSubview(shadowLabel) 
     self.view.addSubview(activityInd) 

    } 

    func stopInd() { 
     shadowLabel.hidden = true 
     activityInd.stopAnimating() 
     activityInd.hidden = true 

     showRooms() 

     if (redrawBool == true) { 
      //showRooms() 
      reset() 
     } else { 
      self.roomContentVCAccess.updateScreen() 
     } 


     redrawBool = false 
    } 

    func showRooms() { 
     roomsList = ["Entire Home"] 

     var serverSettings:AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate) 
     var managedContext: NSManagedObjectContext = serverSettings.managedObjectContext! 
     var request = NSFetchRequest(entityName: "Devices") 
     request.propertiesToFetch = NSArray(objects: "room") as [AnyObject] 
     request.resultType = NSFetchRequestResultType.DictionaryResultType 
     request.returnsDistinctResults = true 
     let deviceFilter = NSPredicate (format: "room <> %@", "Unknown") 
     request.predicate = deviceFilter 

     var roomsResults: Array<AnyObject> = managedContext.executeFetchRequest(request, error: nil)! 

     println("count: \(roomsResults.count)") 

     if roomsResults.count > 0 { 


      for room in roomsResults { 

       var theroom = room["room"] as! String 

       if (theroom != "Alarm") { 
        roomsList.append(theroom) 
       } 

      } 

     } 

     println(roomsList) 
    } 

    func reset() { 
     /* Getting the page View controller */ 
     pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController 
     self.pageViewController.dataSource = self 

     let pageContentViewController = self.viewControllerAtIndex(0) 
     self.pageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil) 

     self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height) 
     self.addChildViewController(pageViewController) 
     self.view.addSubview(pageViewController.view) 
     self.pageViewController.didMoveToParentViewController(self) 

     //stopInd() 
    } 

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
     var index = (viewController as! RoomContentViewController).pageIndex! 

     index++ 

     return self.viewControllerAtIndex(index) 

    } 

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
     var index = (viewController as! RoomContentViewController).pageIndex! 

     if (index <= 0) { 
      return nil 
     } 

     index-- 

     return self.viewControllerAtIndex(index) 

    } 

    func viewControllerAtIndex(index : Int) -> UIViewController? { 
     if ((self.roomsList.count == 0) || (index >= self.roomsList.count)) { 
      return nil 
     } 

     let pageContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("RoomContentViewController") as! RoomContentViewController 

     self.roomContentVCAccess = pageContentViewController 

     pageContentViewController.room = self.roomsList[index] 
     pageContentViewController.pageIndex = index 

     displayRoom = self.roomsList[index] 

     return pageContentViewController 
    } 

    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { 

     return roomsList.count 
    } 

    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 

     return 0 
    } 




} 

и код RoomContentViewController:

protocol RoomContentVCAccess { 
    func updateScreen() 
} 

class RoomContentViewController: UIViewController, RoomContentVCAccess { 

    var pageIndex: Int? 
    var room : String! 

    @IBOutlet weak var screenScrollView: UIScrollView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 

     screenScrollView.contentSize = CGSizeMake(screenScrollView.frame.size.width, 650) 

     roomName.text = room 

     btnViewAllRoomSensors.layer.cornerRadius = 10 
     btnViewAllRoomSensors.layer.masksToBounds = true 

     updateScreen() 

    } 

    override func viewDidAppear(animated: Bool) { 
     updateScreen() 
    } 


    func updateScreen() { 
     println(room) 
     let roomValues = getLabelValues(room) 
     println(roomValues) 
     var roomDevicesCount: Array<Int> = roomValues[0] as! Array<Int> 


     // more code here.... 

    } 

    func getLabelValues(roomName: String) -> (Array<AnyObject>) { 

     var serverSettings:AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate) 
     var managedContext: NSManagedObjectContext = serverSettings.managedObjectContext! 
     var request = NSFetchRequest(entityName: "Devices") 

     let deviceFilter = NSPredicate (format: "room = %@", roomName) 

     // more CoreData code... 

    } 

Общая картина такова, что приложение, когда он принимает данные называет stopInd() в RoomPageListViewController. Изнутри stopInd() мне нужно иметь возможность вызвать updateScreen(), который находится в RoomContentViewController.

+0

Вы можете обновлять свои метки в 'viewWillAppear' в вашем RoomContentViewController. Поэтому, когда ваш пользователь изменится, он увидит обновленные ярлыки. Я не понимаю, почему их необходимо обновлять, если пользователь не видит их. – florianpfisterer

+0

Спасибо @FPWebSystems! Я просто хочу обновить ярлыки на экране и странице, которую они просматривают. Как я могу это сделать? – Kostas

+0

Решена ли проблема? Я понял ваше объяснение: «обновить ярлыки и сохранить пользователя на странице, что они есть», что вы хотите обновить метки в 'RoomContentViewController', пока пользователь находится в' RoomPageListViewController'. Я ошибаюсь? – florianpfisterer

ответ

1

Вы можете создать протокол, которому соответствует ViewController, владеющий метками. Например:

protocol RoomContentVCAccess 
{ 
    func updateLabels() 
} 

Тогда в объявлении класса вашего RoomContentViewController в:

class RoomContentViewController: UIViewController, RoomContentVCAccess 
{ 
    // ... 

    // MARK: - RoomContentVCAccess 
    func updateLabels() 
    { 
     // update your labels 
    } 
} 

Ваш RoomPageListViewController также должен знать, кто его roomContentVCAccess есть. Для этого просто создайте переменную экземпляра в RoomPageListViewController: var roomContentVCAccess: RoomContentVCAccess!, а затем скажите self.roomContentVCAccess = viewController as! RoomContentViewController в вашей функции viewControllerAtIndex.

А затем, когда stopInd() вызывается в RoomPageListViewController, скажем self.roomContentVCAccess.updateLabels().

+0

Я изменил код в сообщении, чтобы отразить протокол. Теперь я получаю сообщение об ошибке: EXC_BAD_INSTRUCTION, когда он пытается выполнить self.roomContentVCAccess.updateScreen() – Kostas

+0

Что-то я делаю неправильно с комнатойPageListVCReference.roomContentVCAccess = self, можете ли вы подробно рассказать о том, что мне нужно сделать там? Спасибо! – Kostas

+0

Можете ли вы предоставить весь текст ошибки в консоли? – florianpfisterer

Смежные вопросы