Brauerei Wagner – Lagerbier ungespundet

Eine Helle wie sie sein muss. Ich weiß jetzt gar nicht was ich groß schreiben soll. Die Brauer aus Merkendorf haben da einen richtig leckeren Hopfen rangeholt und gut mit dem Malz abgeschmeckt. Beängstigend unprätentiös und genau das richtige für die Biergartensaison.

20130515-083912.jpg

20130515-083924.jpg

Franken Bräu – Weißbier

Ganz klar ein Weißbier der bananigeren Sorte, aber ich bilde mir ein, auch ein paar Beerennoten aufzuschnappen, dazu zarter Hopfen. Fazit: eins mit Sternchen, setzen! (Weil das ja klar ist!)

Die Flasche wurde von Matthias (auf ADN @msslovi0) gespendet. Danke!

20130515-083048.jpg

20130515-083123.jpg

Schlossbrauerei Au-Hallertau – Schnee Bock

Von allem Guten viel. So kann man den schweren dunklen Bock zusammenfassen. Aber vielleicht bin ich nach einer halben Flasche auch nicht mehr im 100%igen Vollbesitz meiner geistigen Kräfte. Dafür wurden bis auf die letzte alle Geschmacksknospen bespielt mit blumigen Hopfennoten und kaffeeesken Dunkelmalzaromen. Ein Nachtischbier. Und danach mit einer angenehmen Bettschwere ins selbige.

20130425-200728.jpg

20130425-200735.jpg

20130425-200742.jpg

20130425-200750.jpg

Franken Bräu – Kellergold

Für ein Schwarzbier recht mild, milder als andere Schwarzbiere, wo das Farbmalz gerne mal den Geschmack vorgibt, trotzdem mit voller Malznote und dezenter Hopfigkeit. Leichte Belgienassoziationen kommen auf. Franken Bräu sollte sich mit Ähnlicher Malzmischung mal an ein dunkles Hefeweizen machen. Das würde ich unbesehen kaufen!

Die Flasche wurde von Matthias (auf ADN @msslovi0) gespendet. Danke!

20130423-184146.jpg

20130423-184203.jpg

20130423-184156.jpg

Kohlenmühle – Moggerla

Obwohl schön aroma-hopfig ist das Moggerla süffig mit breiten Malz- und leichten Fruchtaromen in der Hinterhand. Ein sehr lecker Bömbli, das man nicht zu kalt trinken darf, damit die Aromen sich auch entfalten können. Der Hersteller weist extra drauf hin.

Vielen Dank an den MobileMacs Hörer, der uns das zugeschickt hat. Ich weiß leider Deinen Namen nicht. Wir hatten das in Folge 107 aus gutem Grund fast ganz vernichtet, aber ich konnte noch eine Flasche für einen entspannten Test aus’m Glas sicherstellen.

20130418-202202.jpg

20130418-202215.jpg

Franken Bräu – Urhell

Der erste Schluck verrät sofort, da war jemand am Werk, der die Kunst des Ausbalancierens von Malz und Hopfen beherrscht. Und der weiß, wo man guten Hopfen herbekommt. Davon ist nämlich nicht zu knapp in der Flasche. Mir ist unklar warum die Minkwitzer Mitwitzer der Meinung sind das Urhell wäre „ein natürlich milder Genuss“. Ok, es ist kein IPA, aber mild würde ich es nicht nennen.

Die Flasche wurde von Matthias (auf ADN @msslovi0) in einem von zwei großen Paketen geschickt um mir seine Lieblingsbrauerei näher zu bringen. Mission accomplished!

20130415-233537.jpg

20130415-233545.jpg

20130415-233553.jpg

Privatbrauerei Gessner – Heller Doppelbock

Wunderbare Malzaromen treffen auf nassen Hund, der durch eine Hopfenplantage gestromert ist. Mir ist ja völlig unklar, wie man im Land des Weltmarktführers in Sachen Hopfenanbau zu Hopfenextrakt greifen kann. Da hilft auch keine Brautradition bis ins Jahr 1622, liebe Herren (und Damen?) aus Sonneberg. Leistet Euch mal einen ordentlichen Hopfen und die Leute werden Euch die Bude einrennen! Versprochen!

20130411-222248.jpg

20130411-222301.jpg

20130411-222310.jpg

Zwei Bugs im Workshop

Zwei Bugs haben sich in den Workshop eingeschlichen, die ich nicht so stehen lassen kann:

1.-[USVDetailViewController setNewEntry:] wird nicht benutzt. (Ende von Video 11)
Danke für’s Aufspüren an Tobias Müller a.k.a @twam bei App Dot Net

Wir haben eine Methode -[USVDetailViewController setNewEntry:] geschrieben, die ruft [self configureView] auf und diese Methode lädt den Link des Entrys. -[USVDetailViewController setNewEntry:] wird aber nie benutzt. Die Methode -[USVDetailViewController viewDidLoad] ruft ebenfalls [self configureView] auf, insofern wird beim Laden des Views auch der Link geladen. Beides ist ziemlich unschön:

  1. -[USVDetailViewController setNewEntry:] brauchen wir eigentlich nicht, weil wir den Link nicht ändern, während der WebView angezeigt wird. Also löschen wir die Methode, getreu nach dem Motto „less code is better code“.
  2. Dass [self configureView] in -[USVDetailViewController viewDidLoad] aufgerufen wird, ist aber auch nicht korrekt, weil der User ja zurück zur EntriesTableView gehen und ein anderes Entry auswählen könnte, ohne dass der WebView abgebaut wird. Momentan wird er abgebaut, aber verlassen kann man sich darauf nicht. Wer weiß, was Apple in iOS 7 tun wird. Der korrekte Ort für den Aufruf von [self configureView] ist also -[USVDetailViewController viewWillAppear:]. Das wird immer dann aufgerufen, wenn der WebView erscheint.

Die Änderungen:

[self configureView] aus viewDidLoad rausnehmen:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.webView.delegate = self;
}

viewWillAppear: hinzufügen:

- (void) viewWillAppear:(BOOL)animated
{
    [self configureView];
}

-[USVDetailViewController setNewEntry:] kann ganz weg.

2. Im WebView wird der falsches Detail-Link angezeigt (Ende von Video 14)
Danke für’s Aufspüren an Michael Schulz a.k.a @michas auf App Dot Net

In -[USVEntriesTableViewController prepareForSeque:sender:] wird für das Anzeigen der Details das falsche Entry ausgewählt. Das kommt daher, dass -[UITableView indexPathForSelectedRow] verwendet wird um die Row zu ermitteln. Wir haben aber gar keine Row ausgewählt, sondern den Detail Button getappt. Daher liefert der Aufruf von -[UITableView indexPathForSelectedRow] nichts (nil) zurück. Man kann bei Objectve C aber auf einem nil-Pointer Methoden aufrufen ohne einen Crash zu bekommen. Diese Methodenaufrufe liefern dann immer nil bzw. 0 zurück. Das heißt, dass aus dem entries.row in der nächsten Zeile immer 0 herauskommt, und wir somit als Entry immer self.entries[0] benutzen.
Wenn man einen Breakpoint an der Stelle setzt und es laufen lässt, sieht man recht schnell indexPath ist 0. Man sieht aber auch, dass sender eine USVEntryCell ist.

Die richtige Methode ist also -[UITableView indexPathForCell:], die wir mit sender als Argument aufrufen, dann bekommen wir auch den korrekten NSIndexPath.

Die korrigierte Methode lautet also:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"PushToDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
        USVEntry *entry = self.entries[indexPath.row];
        ((USVDetailViewController*)segue.destinationViewController).entry = entry;
    }
    else if ([segue.identifier isEqualToString:@"PushToMedia"])
    {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        USVEntry *entry = self.entries[indexPath.row];
        ((USVMediaViewController*)segue.destinationViewController).enclosureURL = entry.enclosureURL;
    }
}

Sorry für die Fehler. Wer weitere findet, immer her damit!

iOS-Entwicklung für Quereinsteiger

Eine schöne Augustwoche lang saß ich mit Timo Hetzel in dessen Studio und habe einen Workshop zum Thema iOS für Quereinsteiger erbrütet. Jetzt ist er endlich im Kasten und kann in der Undsoversity bestaunt werden.

Ich empfinde den Workshop als recht vollständig und deshalb ist er auch fast 8 Stunden lang geworden, quasi: „einmal alles to go“. Was tatsächlich dabei ist beschreibt Timo aber viel besser als ich es könnte.

Auf jeden Fall sind wir beide stolz wie Bolle und ich kann den Workshop guten Gewissens jedem ans Herz legen, der „immer schon mal was für iOS machen wollte, aber …“

undsoversity-ios1-banner-blog

Diskussion gerne hier in den Kommentaren.