App maken: ook jij kunt het leren!

 

de iOS Academie Forums

Forums - App-ontwikkeling - Swift en iOS: Hoe te beginnen

Cor  Cor heeft nog geen Studiekaart. Klokje05 apr 2015, 20:50
Avatar
Avatar
Berichten:44


Ik heb de 24 videolessen van Roelf met plezier gevolgd. Ik had al met  c# gewerkt en een aantal taalconstructies lijken veel op elkaar. Nu wil ik graag met mijn eerste App beginnen. Hoervoor wil ik een matrix van iconen op het scherm tonen, zoals de achtergrond van het spel Wordfeut. Alle matrixpunten moeten kunnen worden aangeklikt. Ook moeten ze zich bewust zijn van hun buur-matrixpunten. Ik weet niet goed of ik nu buttons of images moet plaatsen op het Storyboard of dat ik ze moeten plaatsen vanuit de Swift code en of ik nu Actions moet maken voor elk matrixpunt of niet. Als een action optreedt weet de afhandelende routine (denk ik) niet wie zijn buurpunt is.

Hopelijk is het een beetje te begrijpen en kan iemand me op weg helpen.

Groetjes,

Cor Mom

 

Reageer


Admin Roelf  Klokje06 apr 2015, 15:27
Avatar


Cor, allereerst: je hebt jezelf een behoorlijk ambitieus doel gesteld! Houd daar rekening mee als het je niet (meteen) lukt; raak dan niet gefrustreerd maar maak eerst één of meer eenvoudiger apps.

Wat je vragen betreft: je zou dit kunnen doen met een aantal views en dan via de DrawRect-methode iets in die views tekenen, of bijvoorbeeld de achtergrondkleur ervan aanpassen.

Met een UITapGestureRecognizer kun je taps ('klikken') detecteren. Die TapGestureRecognizer sleep je vanuit de Object Library (in Xcode) naar het Storyboard: je kunt (een beetje omslachtig, maar het werkt wel) elke view zijn eigen TapGestureRecognizer geven.

Wat het buurpunten-verhaal betreft: er zijn een paar manieren om dat te doen. Je kunt bijvoorbeeld een "lookup"-dictionary maken waarin je voor elke view opgeeft welke view zijn buurtpunt is.

Kun je hier verder mee?

Reageer


Cor  Cor heeft nog geen Studiekaart. Klokje07 apr 2015, 21:22
Avatar
Avatar
Berichten:44


Roelf,

Het valt wel mee met de moeilijkheidsgraad denk ik. Ik wil om te beginnen een matrix van iconen op het scherm zetten. Of dat via buttons moet of via ImageViews dat weet ik nog niet. Dat wil ik doen vanuit de code, dus zonder het storyboard te gebruiken, omdat ik niet voor elke button met de hand een TapGestureRecognizer wil toevoegen. Ook dit wil ik via de code doen. Hier heb ik al voorbeelden van gevonden, maar zover ben ik nog niet.

Om de matrix op het scherm te tonen wil ik een twee dimensionaal array gebruiken en daar heb ik nu het volgende probleem mee.

De vogende class gebruik ik voor het type twee dimansionaal array:

 

class Array2D<T> {

  let rows: Int

  let columns: Int

  private var array: Array<T?>

    init(rows: Int, columns: Int) {

    self.columns = columns

    self.rows = rows

    array = Array<T?>(count: rows*columns, repeatedValue: nil)

  }

  subscript(row: Int, column: Int) -> T? {

    get {

      return array[row*columns + column]

    }

    set {

      array[row*columns + column] = newValue

    }

  }

}

 

Voor type T gebruik ik:

    struct MatrixPoint {

      var row    : Int

      var column : Int

      var xPos   : Int

      var yPos   : Int

      var mPoint : UIImageView

    }

 

Hier declareer ik het array:

    var myMatrix = Array2D<MatrixPoint>(rows: nrRows, columns: nrCols)

 

Nu vul ik het array:    

    for iRow in 0..<nrRows {

      for iCol in 0..<nrCols {

        let x = xBase + iCol * (xSize + xSpace)

        let y = yBase + iRow * (ySize + ySpace)

 

        myMatrix[iCol,iRow]?.xPos = x

        myMatrix[iCol,iRow]?.yPos = y

        myMatrix[iCol,iRow]?.row = iRow

        myMatrix[iCol,iRow]?.column = iCol

        

        myMatrix[iCol,iRow]?.mPoint = UIImageView()

        myMatrix[iCol,iRow]?.mPoint.image = UIImage(named: "icon - 180.png")

        myMatrix[iCol,iRow]?.mPoint.frame = CGRectMake(CGFloat(x),CGFloat(y),CGFloat(xSize),CGFloat(ySize))

        self.view.addSubview(myMatrix[iCol,iRow].mPoint)

      }

    }

 

Bij het allerlaatste statement krijg ik een fout:'MatrixPoint' does not have a memer named 'mPoint'

Dan maak ik er dit van:

self.view.addSubview(myMatrix[iCol,iRow]?.mPoint)

Nu krijg ik de fout: Value of optional type 'UIImageView?' not unwrapped. Did you mean the use of '!' or '?'?

Dan maak ik er dit van:

self.view.addSubview(myMatrix[iCol,iRow]?.mPoint!)

Nu krijg ik de fout: Operand of postfix '!' should have optional type; type is 'UIImageView'

 

Ik begijp niet goed wat er niet goed gaat met die optionals. Ook begrijp ik niet goed waarom er overal myMatrix[iCol,iRow]? (met vraagteken) moet staan.

Btw: als ik de tweedimensionaal array weglaat en er een enkelvoudig array van maak, worden de icons keurig geplaatst.

 

Reageer


Cor  Cor heeft nog geen Studiekaart. Klokje09 apr 2015, 16:51
Avatar
Avatar
Berichten:44


Ik ben er uit. Gewoon als volgt omgaan met optionals:

        if let thisView = matrix[iRow,iCol]?.mPoint {

          self.view.addSubview(thisView)

 

Nou ja, gewoon??? Je bent uren aan het proberen, maar wel heeeel leerzaam :)

 

Reageer


Admin Roelf  Klokje09 apr 2015, 19:49
Avatar


Cor, ik was (One more Thing en zo) een beetje te druk om snel te reageren, maar je oplossing, ook wel optional binding genoemd, is de juiste! Knap gedaan!

 

Reageer