2016-04-20 9 views
0

私は一般的に迅速かつiOSを教えるためのアプリケーションを作成しています。このアプリケーションでは、「レストラン」オブジェクトの配列を作成し、ユーザーが新しいレストランを作成して配列に追加できるようにしたいと考えています。新しいRestaurantインスタンスを作成しても、配列をコピーしているだけなので、実際に何も追加していないと思います。私は、別のファイルにその配列のインスタンスを作成することなく、すべてのファイルにアクセス可能な1つの配列を迅速に作成できるかどうか疑問に思っていました。 (下のコードサンプル)Swift Arrayアクセシビリティすべてのファイルから

/* The following code is in one view controller*/ 

    // Create an array of restuarant instances to use within the application. 

    var restaurants:[Restaurant] = [ 
    Restaurant(name: "Cafe Deadend", type: "Coffee & Tea Shop", 
     location: "G/F, 72 Po Hing Fong, Sheung Wan, Hong Kong", 
     phoneNumber: "232-923423", image: "cafedeadend.jpg", 
     isVisited: false), 

    Restaurant(name: "Homei", type: "Cafe", location: "Shop B, G/F, 22- 
      24A Tai Ping San Street SOHO, Sheung Wan, Hong Kong", 
      phoneNumber: "348-233423", image: "homei.jpg", isVisited:  
      false), 
    Restaurant(name: "Teakha", type: "Tea House", location: "Shop B, 18 
      Tai Ping Shan Road SOHO, Sheung Wan, Hong Kong", 
      phoneNumber: "354-243523", image: "teakha.jpg", isVisited: 
      false) 
    ] 

// Get properties to create a new restaurant object 
@IBOutlet weak var restaurantName: UITextField! 
@IBOutlet weak var restaurantType: UITextField! 
@IBOutlet weak var restaurantLocation: UITextField! 
@IBOutlet weak var restaurantPhoneNumber: UITextField! 
@IBOutlet weak var restaurantImageName: UITextField! 
@IBOutlet weak var restaurantIsVisited: UITextField! 


// Function for when Add Restaurant button is clicked. 
@IBAction func addRestaurant(sender: UIButton) { 
    var isVisited = false 
    // Create local vaiables to the properties once a user enters a new restaurant. 
    let name = self.restaurantName.text! 
    let type = self.restaurantType.text! 
    let location = self.restaurantLocation.text! 
    let phoneNumber = self.restaurantPhoneNumber.text! 
    let image = self.restaurantImageName.text! 
    // check to see what the text inside the text field for is visited is, and then set the variable accordingly. 
    if self.restaurantIsVisited.text! == "Yes" { 
     isVisited = true 
    } else { 
     isVisited = false 
    } 

    //here we add the text into a new restaurant object by invoking the function below: 
    createNewRestaurantObjectAndAddItToArrayOfObjects(name, type: type,  
      location: location, number: phoneNumber, image: image, 
      isVisited: isVisited) 
    } 

    /* Function name speaks for itslef :) 
     this method may be unnessecary, but i will go back and fix it  
     later 
     */ 

    func createNewRestaurantObjectAndAddItToArrayOfObjects(name: 
    String, type:  String, location: String, number: String, image: 
    String, isVisited: Bool) { 
     let newRestaurant = Restaurant(name: name, type: type, 
      location: location, phoneNumber: number, image: image, 
      isVisited: isVisited) 

    // here i append the new restaurant on to the array of rest objects. 
    restaurants.append(newRestaurant) 
    print(restaurants.count) 
    print(restaurants[21]) 
    } 


    // The code from here on is how i access the array from another swift file, 
    var restaurants = AddRestaurantViewController().restaurants 

このコードサンプルが私の問題の説明に役立つことを望みます。ありがとう!

+0

の「平坦」バージョンであるすべてのファイルにアクセス可能な1つの配列を作成すると言うとき、あなたの実際の目標は何ですか?このレストランのセットを長期保存しますか?このリストを別のView Controllerに渡すだけですか?それを保存したい場合は、共有ペアを参照するか、sqliteデータベースを作成することもできます。 – nPn

+0

@nPn私はデータベースが必要とは思わない、このアプリケーションは私が迅速に学ぶのを助けることです。はい、私は別のビューコントローラに渡す必要があります – JacobSiegel

+0

その一般的なパターンは、segueを呼び出すいくつかのアクションがあります。これが起こると、segueオブジェクトを含むprepareForSegueが呼び出され、 "desitination" viewcontollerへの参照を取得できます。次に、プロパティを設定して、その次のコントローラに配列を渡すことができます。ちょっとしたことを知るには、iTunesの大学のバージョンcs193pを使ってください。 – nPn

答えて

0

あなたのコメントを他のビューコントローラでは、基本的な考え方はそれです。あなたの現在のビューコントローラーで何らかのアクションが起こり、別のビューコントローラーに移動したいかもしれませんが、そのコントローラー(配列など)に情報を渡すことができます。

あなたが起動してデータを渡すビューコントローラは、共有するデータを受け入れることができるプロパティを持ちます。例えば、現在のものに似ているプロパティのsuppliedRestaurantsコントローラ。次に、セグが呼び出されると、現在のコントローラーのメソッドprepareForSegueが呼び出され、宛先コントローラーでプロパティーを設定する機会が得られます。これは、現在のコントローラの参照先に参照先を設定するだけです。

ここは簡単な例です。 // MARK: - ナビゲーション

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "EditFromMyCircle" { 
    if let destinationViewController = segue.destinationViewController.contentViewController as? UserPermissionsTableViewController { 
     if let sender = sender as? OurLatitudeMyCircleTableViewCell { 
     destinationViewController.otherUserId = sender.userId 
     } 
    } 
    } 
} 

は、この例では、誰かが私のテーブルにユーザー・エントリをクリックし、私はまた、ユーザーは、いくつかの権限を編集するだろう、私のコントローラにユーザーIDを渡すつもりです。この場合、次のコントローラにユーザーIDを渡していますが、それは何でもかまいません。

これはiOSの非常に一般的なパターンです。

+0

EEPは運命のピラミッドをつかまえましょう! –

+0

ハ、ちょうどこのコメントに気づいた...はいこれはおそらく迅速1.0だった...後のバージョンは、 "平らな"場合は、運命のピラミッド – nPn

0

クラス名を使用してアクセスできるクラス変数を作成します。

見つけてください以下のコード

static var restaurants:[Restaurant] = [ 
    Restaurant(name: "Cafe Deadend", type: "Coffee & Tea Shop", 
     location: "G/F, 72 Po Hing Fong, Sheung Wan, Hong Kong", 
     phoneNumber: "232-923423", image: "cafedeadend.jpg", 
     isVisited: false), 

    Restaurant(name: "Homei", type: "Cafe", location: "Shop B, G/F, 22-24A Tai Ping San Street SOHO, Sheung Wan, Hong Kong", 
     phoneNumber: "348-233423", image: "homei.jpg", isVisited: 
     false), 
    Restaurant(name: "Teakha", type: "Tea House", location: "Shop B, 18 Tai Ping Shan Road SOHO, Sheung Wan, Hong Kong", 
     phoneNumber: "354-243523", image: "teakha.jpg", isVisited: 
     false) 
] 

AddRestaurantViewController.restaurants.append(newRestaurant) 
    print(AddRestaurantViewController.restaurants.count) 
    print(AddRestaurantViewController.restaurants[21]) 

以下のようにあなたの代わりに、インスタンスのクラスを使用する必要があり、この変数を使用して、あなたはクラスの外側からこの変数を使用することができます以下のように

var restaurants = AddRestaurantViewController().restaurants 
0

これは、NPNの答え@

// In a storyboard-based application, you will often want to do a little preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "EditFromMyCircle" { 
    guard let destinationViewController = segue.destinationViewController.contentViewController as? UserPermissionsTableViewController else { return } 
    guard let sender = sender as? OurLatitudeMyCircleTableViewCell else { return } 
    destinationViewController.otherUserId = sender.userId 
    } 
} 
関連する問題