简体   繁体   中英

Swift - access array from another class

In my project I have an array where the user can append elements. My problem right now is that I have another class with a tableView where I want to display all the elements dynamically so if the user adds and element to the array it is also in my tableView .

Class A

var wishListTitlesArray: [String] = [String]()

Class B

var dropDownOptions = [String]() // TableView data -> here I would like to access `wishListTitlesArray`

Update

So thanks for the comments so far, I got the main problem I had but I am still struggling.

My setup:

I create my dropDownButton (which contain a dropDownView ) in my ViewController-Class where I also have my var wishListTitlesArray .

I tried dropDownButton.dropView.dropDownOptions = wishListTitlesArray . However that does not do the full job.

@objc func addWishButtonTapped(notification : Notification){

    popUpView.popUpTextField.text = ""
    self.popUpView.popUpTextField.becomeFirstResponder()

    view.addSubview(visualEffectView)
    view.addSubview(popUpView)
    view.addSubview(wishButton)
    self.view.addSubview(dropDownButton)


    // constrain blurrEffectView
    visualEffectView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    visualEffectView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    visualEffectView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    visualEffectView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    // constrain popUpView
    popUpView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    popUpView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -50).isActive = true
    popUpView.heightAnchor.constraint(equalToConstant: 230).isActive = true
    popUpView.widthAnchor.constraint(equalToConstant: view.frame.width - 85).isActive = true

    // constrain wishButton
    wishButton.centerXAnchor.constraint(equalTo: popUpView.centerXAnchor).isActive = true
    wishButton.centerYAnchor.constraint(equalTo: popUpView.centerYAnchor, constant: 70).isActive = true
    wishButton.heightAnchor.constraint(equalToConstant: 72).isActive = true
    wishButton.widthAnchor.constraint(equalToConstant: 72).isActive = true

    // constrain DropDownButton
    dropDownButton.centerXAnchor.constraint(equalTo: self.popUpView.centerXAnchor).isActive = true
    dropDownButton.centerYAnchor.constraint(equalTo: self.popUpView.centerYAnchor).isActive = true
    dropDownButton.widthAnchor.constraint(equalToConstant: 100).isActive = true
    dropDownButton.heightAnchor.constraint(equalToConstant: 40).isActive = true

    // set the drop down menu's options
    dropDownButton.dropView.dropDownOptions = wishListTitlesArray



    self.view.bringSubviewToFront(visualEffectView)
    self.view.bringSubviewToFront(popUpView)
    self.view.bringSubviewToFront(wishButton)
    self.view.bringSubviewToFront(dropDownButton)
    self.view.bringSubviewToFront(dropDownButton.dropView)

This is where the user can add an element to the wishListTitlesArray :

if let txt = listNameTextfield.text {

        self.newListTextfield.resignFirstResponder()

        // append user-entered text to the data array
        self.wishListTitlesArray.append(txt)
        self.wishListImagesArray.append(self.image!)

        // DonMag3 - append new empty wish array
        self.userWishListData.append([Wish]())

        let theCustomWishlistView = createCustomWishlistView()

        self.view.addSubview(theCustomWishlistView)
        // constrain CustomWishlistView
        theCustomWishlistView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 120.0).isActive = true
        theCustomWishlistView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
        theCustomWishlistView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 30.0).isActive = true
        theCustomWishlistView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -30.0).isActive = true
        theCustomWishlistView.wishlistImage.image = self.image
        theCustomWishlistView.wishlistLabel.text = txt
        theCustomWishlistView.transform = CGAffineTransform(translationX: 0, y: 1000)

        self.view.bringSubviewToFront(containerView)

        // reload the collection view
        theCollectionView.reloadData()
        theCollectionView.performBatchUpdates(nil, completion: {
            (result) in
            // scroll to make newly added row visible (if needed)
            let i = self.theCollectionView.numberOfItems(inSection: 0) - 1
            let idx = IndexPath(item: i, section: 0)
            self.theCollectionView.scrollToItem(at: idx, at: .bottom, animated: true)

            // close (hide) the "New List" view
            self.closeButtonTappedNewList(nil)

        })

and the problem right now is that if the user adds an element, dropDownOptions is not updating the data accordingly. So how can I access the updated list? Thanks for all the comments so far!

This is fairly straightforward OO programming. As somebody pointed out, you're dealing with instance variables and instances of classes, not classes.

An analogy:

Instances: If you want one instance of a class to get a value from an instance of another class, it's like having your Toyota car request the radio station presets from your friend's Honda and set your radio the same way.

Classes: The Toyota motor company decides they like the radio presets that Honda uses, so they read the radio station presets from the Honda company and the Toyota factory uses those settings for all new Toyotas.

In class A, make wishListTitlesArray public:

public var wishListTitlesArray: [String] = [String]()

Then, your Class B object will need a pointer to the Class A object. There are various ways to do that. Let's say you set up Class B to take a Class A object at init time:

Class B {
   var myAObject: A
   var dropDownOptions: [String]

   init(aObject: A) {
      myAObject = anObject
      dropDownOptions = myAObject.wishListTitlesArray 
   }
//more code here
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM