2017-03-29 8 views
-1

私はデバイスから連絡先リストをインポートしたアプリケーションで作業しています。連絡先を「追加」するオプションが与えられていますが、機能に関してはあまり効果がありません。私は最高のコーダーではないので、私のことを聞いてみてください。私がしようとしているのは、データ/選択されたテーブルビューセルを取り出し、別のページに表示することです。他のページにデータを表示しようとしましたが、オーバーライド機能を移動するとエラーが発生するため、これを実行する必要があります。それは私が信じているデータを取る必要があると私に信じさせる。新しい連絡先?それを変数として設定し、新しいビューコントローラを作成してエラーなしでコードを追加できる新しいページに表示します。選択したセルを別のView Controllerに送信するにはどうすればいいですか?

私のJSONデータをどのように保存するかを決める必要があります。可能であれば、それと同等の文字列を設定して、新しいView Controllerに送信するか、コードIでデータベースに送信しますすでに作成されています。

私は取得したエラーと正確なコードが原因でステートメントをどこに入力するのか分かりません。

私が実行しようとしていることをひどく説明して申し訳ありませんが、何が必要なのかを把握していますが、初心者です。

自分の電話から連絡先を取り出してアクセスするMy Master View Controller。

import UIKit 
import Contacts 
import ContactsUI 

class MainViewController: UIViewController { 

@IBOutlet weak var textField: UITextField! 
@IBOutlet weak var tableView: UITableView! 

var store = CNContactStore() 
var contacts: [CNContact] = [] 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

//MARK: - User Actions 

@IBAction func contactListPressed(_ sender: AnyObject) { 
    let contactPickerViewController = CNContactPickerViewController() 
    contactPickerViewController.delegate = self 
    present(contactPickerViewController, animated: true, completion:  nil) 
} 

@IBAction func addContactPressed(_ sender: AnyObject) { 
    let newContact = CNMutableContact() 

    newContact.givenName = "Apps" 
    newContact.familyName = "Foundations" 
    newContact.nickname = "AF" 

    if let image = UIImage(named: "logo-apps-foundation.jpg"), 
     let data = UIImagePNGRepresentation(image){ 
     newContact.imageData = data 
    } 

    let phone = CNLabeledValue(label: CNLabelWork, value: CNPhoneNumber(stringValue: "+441234567890")) 
    newContact.phoneNumbers = [phone] 

    let email = "" //Your Input goes here 
    let Email = CNLabeledValue(label:CNLabelWork, value: email as NSString) 
    newContact.emailAddresses = [Email] 


    newContact.jobTitle = "Apps Foundation" 
    newContact.organizationName = "Apps Foundation" 
    newContact.departmentName = "IT" 

    let facebookProfile = CNLabeledValue(label: "Facebook", value: CNSocialProfile(urlString: "https://www.facebook.com/appsfoundation", username: "AppsFoundation", userIdentifier: "appsfoundation", service: CNSocialProfileServiceFacebook)) 
    let twitterProfile = CNLabeledValue(label: "Twitter", value: CNSocialProfile(urlString: "https://twitter.com/AppsFoundation", username: "AppsFoundation", userIdentifier: "appsfoundation", service: CNSocialProfileServiceTwitter)) 
    newContact.socialProfiles = [facebookProfile, twitterProfile] 

    let skypeProfile = CNLabeledValue(label: "Skype", value: CNInstantMessageAddress(username: "AppsFoundation", service: CNInstantMessageServiceSkype)) 
    newContact.instantMessageAddresses = [skypeProfile] 

    var birthday = DateComponents() 
    birthday.year = 1991 
    birthday.month = 1 
    birthday.day = 1 
    newContact.birthday = birthday 

    let request = CNSaveRequest() 
    request.add(newContact, toContainerWithIdentifier: nil) 
    do { 
     try store.execute(request) 
     let alert = UIAlertController(title: "Contacts iOS 9", message: "New contact has been created", preferredStyle: UIAlertControllerStyle.alert) 
     alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 
     present(alert, animated: true, completion: nil) 
    } catch let error{ 
     print(error) 
    } 
} 

@IBAction func textFieldValueChanged(_ sender: AnyObject) { 
    if let query = textField.text { 
     findContactsWithName(query) 
    } 
} 

//MARK: - Private Methods 

func findContactsWithName(_ name: String) { 
    AppDelegate.sharedDelegate().checkAccessStatus({ (accessGranted) -> Void in 
     if accessGranted { 
      DispatchQueue.main.async(execute: {() -> Void in 
       do { 
        let predicate: NSPredicate = CNContact.predicateForContacts(matchingName: name) 
        let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactBirthdayKey, CNContactViewController.descriptorForRequiredKeys()] as [Any] 
        self.contacts = try self.store.unifiedContacts(matching: predicate, keysToFetch:keysToFetch as! [CNKeyDescriptor]) 
        self.tableView.reloadData() 
       } 
       catch { 
        print("Unable to refetch the selected contact.") 
       } 
      }) 
     } 
    }) 
} 

func updateContact(_ contactIdentifier: String) { 
    do { 
     let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactBirthdayKey, CNContactPhoneNumbersKey, CNContactViewController.descriptorForRequiredKeys()] as [Any] 
     let contact = try store.unifiedContact(withIdentifier: contactIdentifier, keysToFetch:keysToFetch as! [CNKeyDescriptor]) 

     let contactToUpdate = contact.mutableCopy() as! CNMutableContact 
     contactToUpdate.phoneNumbers = [CNLabeledValue(label: CNLabelWork, value: CNPhoneNumber(stringValue: "+440987654321"))] 

     let saveRequest = CNSaveRequest() 
     saveRequest.update(contactToUpdate) 
     try store.execute(saveRequest) 
    } catch let error{ 
     print(error) 
    } 
} 

} 

//MARK: - UITableViewDataSource 

extension MainViewController: CNContactPickerDelegate { 

func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) { 
    let selectedContactID = contact.identifier 
    updateContact(selectedContactID) 
} 

} 

//MARK: - UITableViewDataSource 

    extension MainViewController: UITableViewDataSource { 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return contacts.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let CellIdentifier = "MyCell" 
    let cell = tableView.dequeueReusableCell(withIdentifier: CellIdentifier) 
    cell!.textLabel!.text = contacts[indexPath.row].givenName + " " + contacts[indexPath.row].familyName 

    if let birthday = contacts[indexPath.row].birthday { 
     let formatter = DateFormatter() 
     formatter.dateStyle = DateFormatter.Style.long 
     formatter.timeStyle = .none 

     cell!.detailTextLabel?.text = formatter.string(from: ((birthday as NSDateComponents).date)!) 
    } 
    return cell! 
} 

} 

//MARK: - UITableViewDelegate 

extension MainViewController: UITableViewDelegate { 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let controller = CNContactViewController(for: contacts[indexPath.row]) 
    controller.contactStore = self.store 
    controller.allowsEditing = false 
    self.navigationController?.pushViewController(controller, animated: true) 
} 

} 

は、私はこのような何かを組み込む必要がある知っているが、私は、変数または正しい型にJSONデータを設定し、このタイプ

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
if segue.identifier == "showDetail" { 
    if let indexPath = self.tableView.indexPathForSelectedRow { 
     let controller = segue.destination as! ViewControllerB 
     controller.selectedName = objects[indexPath.row] 
    } 
} 
} 

のコードを組み込むことがどこか方法がわかりませんひどい説明を申し訳ありません。可能な限り助けていただければ幸いです。私はかなりの間苦労しています。

+0

を与え、MVCはモデルとビューの分離を意味します。そして、[選択されたModelクラスのインスタンスを次のViewControllerに渡す](http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – NSNoob

+1

[View Controller間でデータを渡す](http ://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – NSNoob

+0

jsonを使用してモデルを作成し、それらのモデルをあるVCから別のVCに渡します –

答えて

0

まず、データを渡そうとしている別のView Controllerが必要です。これは、Interface Builder上にあるか、またはプログラムによって実行されます(IBの場合は今のところ想定しています)。次に、メインVCと詳細VCの間にsegueを設定し、識別子などを与える必要があります。 showDetail

次は、詳細VCが正常に動作するために必要なデータを特定することです。各データ項目(名前、年齢、電話番号、電子メールなど)ごとに個別の変数を設定できますが、多くの情報がある場合は、データモデルを使用することをお勧めします。あなたの場合、連絡先情報を表示しようとしているので、単にCNContactを再利用できます。

prepareForSegue機能のMain VCから移行する前に、Details VCにCNContactが必要です。また、セグを開始するには、performSegueを呼び出すだけです。

・ホープ少なくともモデル・クラスで細胞を移入し、モデルクラスを作成します。あなたにいくつかの方向

関連する問題