섹션을 다룰 때 다차원 배열을 사용하지 않고도 커스텀 오브젝트로 UITableView를 생성하려고합니다. 제가 누락 된 부분은 객체를 정렬 할 논리 부분이라고 생각합니다. 개체는 기본적으로 사전입니다. var section: Int
은 0
또는 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")
}
}
고맙습니다! 이 방법은 트릭을 만들었습니다. UI를 일치시키기 위해 몇 가지 다른 장소에 추가해야했지만 예상 했었습니다. :] – ErrorCode3000