Why won't my coroutine continue after the bool turns true?

I must not understand how courutines work. I am making an RPG base. I’m at the stage where you would select a button for attacking then select the enemy that is being attacked. I got a coroutine for starting the attack then waits for bool to turn true when the target is selected in another script. The script would then call a mothod in another script for doing the attacking. The Thing that the coroutine won’t continue after the requirements a met. Could anyone give me the reason why please.

Actions Controller

public class ActionsController : MonoBehaviour
{
public List partyMembers;
public List enemies;
public TurnSorter turnSorter;
public Targeter targeter;
int target;
bool choiceMade;

void Start()
{
    targeter = FindObjectOfType<Targeter>();
    partyMembers = FindObjectOfType<PartyController>().partyMembers;
    enemies = FindObjectOfType<EnemyController>().enemies;
    turnSorter = FindObjectOfType<TurnSorter>();
    choiceMade = false;
}

public void Targeter(int currentTarger)
{
    target = currentTarger;
    choiceMade = true;
    Debug.Log("choicemade" + choiceMade);
}

public void Attack()
{
    StartCoroutine (StartAttack());
}

public IEnumerator StartAttack()
{
    yield return new WaitForEndOfFrame();
    targeter.DisplayChoices();
    while (choiceMade == false)
    { 
        yield return null; 
    }
    partyMembers[turnSorter.currentPartyTurn].Attacking(enemies[target]);
    Debug.Log(turnSorter.currentEnemyTurn);
    Debug.Log(enemies[target].GetCurrentHealth());
    choiceMade = false;
}

Targeter

public class Targeter : MonoBehaviour
{
    public GameObject arrow;
    int currentChoice;
    int maxChoice;
    public Enemy[] enemies;
    bool makingChoice;
    InitialiseButton InitialiseButton;

    void Start()
    {
        arrow = gameObject.transform.GetChild(0).gameObject;
        enemies = FindObjectsOfType<Enemy>();
        InitialiseButton = FindObjectOfType<InitialiseButton>();
        currentChoice = 1;
        maxChoice = enemies.Length;
        makingChoice = false;
        UpdateArrowPosition();
        HideChoices();
    }

    void Update()
    {
        if (makingChoice)
        {
            InitialiseButton.DisableButtons();
            if (Input.GetKeyDown(KeyCode.S))
            {
                currentChoice--;
                if (currentChoice < 1)
                {
                    currentChoice = 1;
                }
                UpdateArrowPosition();
            }

            if (Input.GetKeyDown(KeyCode.W))
            {
                currentChoice++;
                if (currentChoice > maxChoice)
                {
                    currentChoice = maxChoice;
                }
                UpdateArrowPosition();
            }

            if (Input.GetKeyDown(KeyCode.Space))
            {
                FindObjectOfType<ActionsController>().Targeter(currentChoice);
                InitialiseButton.EnableButtons();
                HideChoices();
            }
        }
    }

    public void DisplayChoices()
    {
        gameObject.transform.localScale = new Vector2(1,1);
        makingChoice = true;
    }

    void HideChoices()
    {
        transform.localScale = new Vector2(0, 0);
        makingChoice = false;
    }

    private void UpdateArrowPosition()
    {
        arrow.transform.position = enemies[currentChoice - 1].transform.position;
    }
}

This code looks pretty good to me. I’m going to assume public void Targeter(int currentTarger) is called from Unity, by a button click or something?
Can you verify that method is being called and the value of choiceMade is being set to true? Then verify the value of choiceMade in your while loop also has the value of true. Can you add some break points to verify the value of choiceMade is true in StartAttack() after Targeter(int currentTarger) is called?