Programim dhe zhvillim, javascript, python, php, html

shto të dhënat në një grup në një kontrollues të ndryshëm pamjesh me shpejtësi

Unë jam mbërthyer me një problem tani dhe kam nevojë për ndihmë. Aktualisht, unë kam dy kontrollues të ndryshëm të pamjes në projektin tim, VC1 dhe VC2. Në projekt, unë kam një shirit navigimi dhe një shirit skedash.

Në VC1, unë kam një klasë UIViewController dhe ajo përmban një UITableView dhe tablaViewCell. Gjithashtu, unë shtoj një grup liveEvents si më poshtë.

 public var liveEvents: [LiveEvent] = [
    LiveEvent(title: "aaaa"),
    LiveEvent(title: "bbbbbb"),
    LiveEvent(title: "ccccccc")
]

Pastaj, nga qeliza, shtova segue në VC2. Në VC2, shtova IBaction në artikullin barbutton si më poshtë.

@IBOutlet weak var eventTitle: UITextField!

@IBAction func saveNewLiveEvent(_ sender: Any) {
    
    if let eventTitle = eventTitle.text {
        let vc = VC1()
        vc.liveEvents.append(LiveEvent(title: eventTitle))
        print("liveEvent: \(vc.liveEvents)")
        navigationController?.popViewController(animated: true)
    }
}

dhe u përpoqa të shtoj një ngjarje në grupin liveEvent në VC1.

Në tastierë, unë mund të shoh që ngjarja e re është shtuar në VC2, megjithatë, kur shtoj deklaratën e printimit në VC1, nuk shoh se vlera e re e shtuar është shtuar (gjithashtu, vlera e re nuk pasqyrohet në tabelë pamje.) kur kthehem nga VC2 në VC1.

Po pyesja veten se si ta shtoja vlerën në një grup që është në skedarin e ndryshëm swift.

Nëse e dini se çfarë po bëj gabim, ju lutem më njoftoni.

07.06.2021

  • Keni krijuar një shembull të ri VC1 ndërsa telefononi saveNewLiveEvent, nuk është ai nga i cili keni shtyrë. Gjithashtu, krijimi i objekteve të viewController si VC1(), nuk do të thërrasë metodat e lifeCycle të kontrolluesit. 07.06.2021

Përgjigjet:


1

Ke krijuar një shembull të ri të VC1VC2, nuk është i njëjti shembull nga e ke shtyrë. Pra, kjo është arsyeja pse tabela juaj nuk po përditësohet.

Ju mund të përdorni qasjen delegation për të arritur rezultatin tuaj. Unë kam krijuar një kod demo për këtë, ju lutemi kontrolloni më poshtë.

TestController1 (ose VC1)-

import UIKit

class LiveEvent{
    var title:String
    
    init(title:String) {
        self.title = title
    }
}

class TestController: UIViewController {
    
    @IBOutlet weak var testTableView: UITableView!
    
    public var liveEvents: [LiveEvent] = [
        LiveEvent(title: "aaaa"),
        LiveEvent(title: "bbbbbb"),
        LiveEvent(title: "ccccccc")
    ]
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
}

extension TestController:UITableViewDelegate,UITableViewDataSource{
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        liveEvents.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TestTableCell
        cell.eventLabel.text = liveEvents[indexPath.row].title
        return cell
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let destinationVC = segue.destination as? TestControllerTwo
        destinationVC?.delegate = self
    }
    
}


extension TestController:AddEventsInVC1{
    func addNewEvent(event: LiveEvent) {
        liveEvents.append(event)
        testTableView.reloadData()
    }
}

TestController2 (ose VC2)-

import UIKit

protocol AddEventsInVC1:AnyObject {
    func addNewEvent(event:LiveEvent)
}

class TestControllerTwo: UIViewController {
    
    weak var delegate:AddEventsInVC1?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    
    @IBAction func addEventAndPop(_ sender: Any) {
        
        delegate?.addNewEvent(event: LiveEvent(title: "I am New"))
        navigationController?.popViewController(animated: true)
    }
    
}

CustomCellClass-:

import UIKit

class TestTableCell: UITableViewCell {

    @IBOutlet weak var eventLabel: UILabel!
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

Dizajni Storyboard është i thjeshtë, thjesht kam TableView me cell të vetme, me një label në të.

Unë e kam lidhur segue në vetë storyboard nga cellVC2 për qëllime demo.

07.06.2021

2

Këtu është një zgjidhje për ju. Me pak fjalë, nuk mund të krijoni një shembull të ri të VC1 siç bëtë në VC2. Ju duhet një shembull ekzistues i cili mund të arrihet duke përdorur qasjen protocol. Kontrolloni kodin. Kjo do t'ju zgjidhë problemin.

// 1) Protocol to connect two controllers VC1 and VC2
// You can add protocol code in your VC1 class or you can create new .swift file and add there as well.
protocol LiveEventProtocol: AnyObject {
    func addEvent(_ liveEvent: LiveEvent)
}

class VC1: UIViewController, LiveEventProtocol {
    
    public var liveEvents: [LiveEvent] = [
        LiveEvent(title: "aaaa"),
        LiveEvent(title: "bbbbbb"),
        LiveEvent(title: "ccccccc")
    ]
    
    // 2) go to vc2 but don’t forget to set vc2.delegate = self
    // ⭐️ That is the key here.
    // `vc2.delegate = self` connects VC1 and VC2
    func gotoVC2() {
        let vc2 = VC2()
        vc2.delegate = self
        self.navigationController?.pushViewController(VC2(), animated: true)
    }
    
    // 3) Implementing protocol method.
    // This is a method where VC2 will delegate work to VC1 to append liveEvent.
    func addEvent(_ liveEvent: LiveEvent) {
        self.liveEvents.append(liveEvent)
        // now do your reload stuff.
    }
}

class VC2: ViewController {
    weak var delegate: LiveEventProtocol?
    var eventTitle = UITextField(frame: .zero)
    
    func saveNewLiveEvent() {
        if let eventTitle = eventTitle.text {
            // ❌ this is wrong.
            // Reason,
            //  -> you are creating new instance of VC1
            //  -> Instead we need the existing instance of VC1.
            //  -> This can be achieve using protocol approach.
            // let vc = VC1()
            // vc.liveEvents.append(LiveEvent(title: eventTitle))
            
            // ✅ this is correct way to do it.
            // Here, we are justing passing LiveEvent value through delegate approach which is connected with VC1.
            delegate?.addEvent(LiveEvent(title: eventTitle))
            
            navigationController?.popViewController(animated: true)
        }
    }
}
07.06.2021
Materiale të reja

Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

Faketojeni derisa ta arrini me të dhënat false
A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

Si të përdorni kërkesën API në Python
Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

Një udhëzues hap pas hapi për të zotëruar React
Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

AI dhe Psikologjia — Pjesa 2
Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

Esencialet e punës ditore të kodit tim VS
Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..