2016-10-07 2 views
0

섹션을 다룰 때 다차원 배열을 사용하지 않고도 커스텀 오브젝트로 UITableView를 생성하려고합니다. 제가 누락 된 부분은 객체를 정렬 할 논리 부분이라고 생각합니다. 개체는 기본적으로 사전입니다. var section: Int0 또는 1으로 설정되어 있습니다. 이 객체는 현재 배열에 저장되고 테이블 뷰에로드됩니다. 다른 vars는 다양한 정보 비트입니다.Swift에서 섹션과 커스텀 오브젝트가있는 UITableView

class MenuModel { 
    var displayText: String 
    var displayImage: UIImage 
    var location: String 
    var otherData: String 
    var section: Int 
} 

는 다음과 같이 호출 :

나는이처럼 보이는 물체가

let bc = MenuModel(displayText: "Basic Commands", displayImage: UIImage(named: "[email protected]")!, location: "commands", otherData: "", section: 0) 
self.MenuList.append(bc)  //Right now I'm appending it to an array called MenuList 

을 나는 MenuModel.section에 액세스하고 결과를 얻어서 그 섹션으로 개체를 정렬 할 수 있습니다 방법 0 또는 1? 이 필요 tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int


에서 수행 할 수 있는가이 부분은 내 현재의 구현에보다 구체적인이다. UI가 업데이트되어 매우 행복해 보이지만, 완료 핸들러가 한 번 실행 되더라도 MenuList 배열은 네 번 표시됩니다. 완벽하지는 않습니다.

이것은 실행중인 코드입니다. 근본적으로 네트워크에 대한 호출이 두 개 있습니다. 하나는 Firebase에, 하나는 Alamofire를 통해 호출합니다.

public func ConstructMenu(completion: (Bool) ->()) { 

    if let user = FIRAuth.auth()?.currentUser { 
      // User is signed in. 

      GlobalFirebase.UserRef.child(user.uid).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
       let serverAdmin = snapshot.value!["serverAdmin"] as! String 
       if serverAdmin != "none" { 

        self.log.info("User as a Server Admin signed in") 

        let bc = MenuModel(displayText: "Basic Commands", displayImage: UIImage(named: "[email protected]")!, location: "commands", otherData: "", section: 0) 
        let ca = MenuModel(displayText: "Console Access", displayImage: UIImage(named: "[email protected]")!, location: "console", otherData: "", section: 0) 
        let sm = MenuModel(displayText: "Server Management", displayImage: UIImage(named: "[email protected]")!, location: "management", otherData: "", section: 0) 
        let cs = MenuModel(displayText: "Connect and Share", displayImage: UIImage(named: "[email protected]")!, location: "connect", otherData: "", section: 0) 

        self.MenuList.append(bc, ca, sm, cs) 
        completion(true) 


       } else { 

        self.log.info("User not a Server Admin signed in") 

        let ns = MenuModel(displayText: "New Server", displayImage: UIImage(named: "[email protected]")!, location: "makeServer", otherData: "", section: 0) 

        self.MenuList.append(ns) 
        completion(true) 
       } 
      }) 

     } else { 
      self.log.info("No user is signed in.") 

      let ns = MenuModel(displayText: "New Server", displayImage: UIImage(named: "[email protected]")!, location: "makeServer", otherData: "", section: 0) 

      self.MenuList.append(ns) 
      completion(true) 

     } 

    //Check for Other Archetype Servers 

    //Query Multicraft 
    let commandDictionary = [ "APIuser" : GlobalConstants.MulticraftAPIUser, 
           "APIkey" : "\(GlobalConstants.MulticraftAPIKey)", 
           "APIreq" : "listServers"] 

    Alamofire.request(.POST, "\(GlobalConstants.MulticraftAPIURL)tworeq.php", parameters: commandDictionary) 
     .responseJSON(){ response in 
      self.log.info("Request: \(response.result.value)") 
      if let _ = response.result.value { 

       if (JSON(response.result.value!)["success"] == true) { 

        let json = JSON(response.result.value!) 
        // self.log.verbose(json["data"]["Servers"].dictionaryValue) 

        for (key, value) in json["data"]["Servers"].dictionaryValue { 
         self.log.verbose("\"\(key) : \(value.string!)\"") 

         var name = "\(value.string!)" 
         var serverID = "\(key)" 
         var image = UIImage(named: "server_\(Int(arc4random_uniform(4) + 1))")! 

         var item = MenuModel(displayText: name, displayImage: image, location: "serverInfo", otherData: serverID, section: 1) 

         self.MenuList.append(item) 


        } 

        completion(true) 
       } //If result succeeds 
    } 
} // Alamofire Request 

} 

및 I는 다음과 같이 그 코드를 호출하고 있습니다 : 당신은 신속하게 필터 방법 섹션으로의 menulist 배열이 있음을 필터링 할 수 있습니다

override public func viewWillAppear(animated: Bool) { 

    MenuList.removeAll() 
    self.ConstructMenu() {completion in completion 
     if completion == true { 
      self.tableView.reloadData() 
      print("Menu Setup Completed") 
     } else { 
      self.tableView.reloadData() 
      print("Menu Setup Failed") 
     } 
    } 

답변

1

- 그것은 다음과 같이 것 : let sectionZero = menuList.filter { (model) -> Bool in return model.section == 0 } let sectionOne = menuList.filter { (model) -> Bool in return model.section == 1 }

menuList와 tableView를 자주 다시로드하는 것은 쉽지 않을지 모르지만 다차원 배열을 사용하지 않으려면 할 수 있습니다.

+0

고맙습니다! 이 방법은 트릭을 만들었습니다. UI를 일치시키기 위해 몇 가지 다른 장소에 추가해야했지만 예상 했었습니다. :] – ErrorCode3000

관련 문제