2016-12-08 3 views
0

추출한 JSON 데이터를 가져 와서 UITableview에 표시하는 프로젝트를 만들었습니다. 다운로드로 인해 앱 부담을 싫어합니다. 모든 것. 그래서 사용자가 행을 선택했을 때만 직원 세부 정보를 검색 할 것입니다. 사용자가 페이지를 슬라이드하여 각 페이지를 탐색 할 수 있도록 페이지보기 컨트롤러를 사용하고 있습니다 .. 보낸 값을 어떻게 보낼 수 있습니까? detailviewcontroller 페이지 dispatch_sync에서 페이지?dispatch_sync (dispatch_get_main_queue(), {})에서 다른 페이지로 값을 보내거나 반환하는 방법

이것은

func viewDetailViewController(index: Int) -> DetailViewController? { 
    if let storyboard = storyboard, 
     page = storyboard.instantiateViewControllerWithIdentifier("DetailViewController") as? DetailViewController {   

       let currentEmployee = employeeStore.searchEmployee[index] 

       getJson().testsearchJSON(currentEmployee.id, handler: {(employeeDetails) -> Void in 
        dispatch_sync(dispatch_get_main_queue(), { 
         page.employee = employeeDetails 
         page.employeeIndex = index 
         return page //fail here 
        }) 
       }) 
    } 
    return nil 
} 
managePageviewController

에서 내 코드입니다

이 시도가 좋아하는이 DetailviewController

내 페이지
class DetailViewController: UIViewController, UITextFieldDelegate { 

// MARK:- Propertise 
@IBOutlet var employeePic: UIImageView! //employee picture 
@IBOutlet var employeeName: UILabel! // name 
@IBOutlet var employeeTitle: UILabel! //job title 
@IBOutlet var dateCreated: UILabel! 
@IBOutlet var managerName: UITextField! 
@IBOutlet var oaName: UITextField! 
@IBOutlet var emailField: UITextField! 
@IBOutlet var departmentField: UITextField! 
@IBOutlet var divisionField: UITextField! 
@IBOutlet var companyField: UITextField! 


var employee: Employee! { 
    //add applicataion name 
    didSet { 
     navigationItem.title = employee.name 
    } 
} 
//current employee index 
var employeeIndex: Int! 

let dateFormatter: NSDateFormatter = { 
    let formatter = NSDateFormatter() 
    formatter.dateStyle = .MediumStyle 
    formatter.timeStyle = .NoStyle 
    return formatter 
}() 

//MARK:- assign values 
override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    employeeName.text = employee.name 
    employeeTitle.text = "(" + employee.title + ")" 
    emailField.text = employee.email 
    managerName.text = employee.manager 
    dateCreated.text = dateFormatter.stringFromDate(employee.dateCreated) 
    oaName.text = employee.oa 
    departmentField.text = employee.department 
    divisionField.text = employee.division 
    companyField.text = employee.company 

    //retrieve image 
    employeePic.thumbnails() 
    employeePic.image = UIImage(named: "Default Image") 

} 

답변

0

는 것이 경우입니다 DetailViewController의 viewDidLoad 또는 viewWillAppear 함수에서 데이터를 가져 오는 것이 좋습니다. 뭐 그런 : MainViewController에서

: DetailViewController에서

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    viewDetailViewController(index : indexPath.row, employee: employeeStore.searchEmployee[indexPath.row]) 
} 

func viewDetailViewController(index: Int, employee: Employee) { 
    let detailController = storyboard.instantiateViewControllerWithIdentifier("DetailViewController") as? DetailViewController 
    detailController.currentEmployee = employee 
    // present/push/etc detail controller 
    present(detailViewController, animated: true, completion: nil) 
} 

:

var employee : Employee? 
... 

override func viewDidLoad() { 
    super.viewDidLoad() 
    if let employee = currentEmployee { 
     getJson().testsearchJSON(employee.id, handler: {(employeeDetails) -> Void in 
       dispatch_sync(dispatch_get_main_queue(), { 
        //reload UI for employeeDetails 
      }) 
     }) 
    } 
} 

은 또한 당신은 예를 들어, GCD 그룹에 대한 블록 로딩을 기다릴 GCD를 사용할 수 있습니다.

+0

도움 주셔서 감사합니다. managePageViewController 사용하고 있습니다 ... segue 통과하지 않고 페이지를 탐색 할 수 있습니까? – xxmilcutexx

+0

당신은 환영합니다 :) 예, 가능합니다. UIPageViewController 들어이 어쩌면 도움이 요점을 발견했습니다 - https://gist.github.com/andreif/3bace9961c7e70995856. 또한 당신은 stackoverflow로 검색 할 수 있습니다 :) – Eridana

0

내해서 getJSON(). testSearchJSON 기금

func testsearchJSON(id:String, handler: (Employee) -> Void) { 
    let requestURL: NSURL = NSURL(string: (favUrl + id))! 
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL) 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(urlRequest) { 
     (data, response, error) -> Void in 

     let httpResponse = response as! NSHTTPURLResponse 
     let statusCode = httpResponse.statusCode 

     //retrieve data successfully 
     if (statusCode == 200) { 
      do { 
       let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) 
       if data!.length > 0 && error == nil { 

        guard let name = json["firstName"] as? String, 
        let title = json["title"] as? String, 
        let id = json["id"]!, 
        let manager = json["managerName"] as? String, 
        let oa = json["oa"] as? String, 
        let email = json["email"] as? String, 
        let department = json["department"] as? String, 
        let division = json["division"] as? String, 
        let company = json["company"] as? String 
        else { 
          return; 
        } 
        let newEmployee = Employee(id: String(id), name: name, title: title, manager: manager, oa: oa, email: email, department: department, division: division, company: company) 

        //test 

        handler(newEmployee) 

       } 
      } catch { 
       print("Error with JSON: \(error)") 
      } 
     } 
    } 
    task.resume() 
    } 
} 

입니다 내 생각이

func viewDetailViewController(index: Int) -> DetailViewController? { 
    if let storyboard = storyboard, 
     page = storyboard.instantiateViewControllerWithIdentifier("DetailViewController") as? DetailViewController {   

       let currentEmployee = employeeStore.searchEmployee[index] 

       getJson().testsearchJSON(currentEmployee.id, handler: {(employeeDetails) -> Void in 
         page.employee = employeeDetails 
         page.employeeIndex = index 
         return page //fail here 
       }) 
    } 
    return nil 
} 

func testsearchJSON(id:String, handler: (Employee) -> Void) { 
    let requestURL: NSURL = NSURL(string: (favUrl + id))! 
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL) 

    let semaphore = dispatch_semaphore_create(0); 

    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(urlRequest) { 
     (data, response, error) -> Void in 

     let httpResponse = response as! NSHTTPURLResponse 
     let statusCode = httpResponse.statusCode 

     //retrieve data successfully 
     if (statusCode == 200) { 
      do { 
       let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) 
       if data!.length > 0 && error == nil { 

        guard let name = json["firstName"] as? String, 
        let title = json["title"] as? String, 
        let id = json["id"]!, 
        let manager = json["managerName"] as? String, 
        let oa = json["oa"] as? String, 
        let email = json["email"] as? String, 
        let department = json["department"] as? String, 
        let division = json["division"] as? String, 
        let company = json["company"] as? String 
        else { 
          dispatch_semaphore_signal(semaphore); 
          return; 
        } 
        let newEmployee = Employee(id: String(id), name: name, title: title, manager: manager, oa: oa, email: email, department: department, division: division, company: company) 

        //test 

        handler(newEmployee) 
        dispatch_semaphore_signal(semaphore); 
       } 
      } catch { 
       dispatch_semaphore_signal(semaphore); 
       print("Error with JSON: \(error)") 
      } 
     } 
    } 
    task.resume() 
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
    } 
} 
+0

GDC의 반환 페이지 부분이 실패했습니다. – xxmilcutexx

+0

이 라인 핸들러 (newEmployee)를 바꿀 수 있습니까 dispatch_semaphore_signal (세마포어); – aahmetbas